在mono中使用c#驱动程序比较mongo集合的两个字段
Posted
技术标签:
【中文标题】在mono中使用c#驱动程序比较mongo集合的两个字段【英文标题】:Comparing two fields of mongo collection using c# driver in mono 【发布时间】:2017-06-14 16:47:56 【问题描述】:我对 Mongodb 和 C# 驱动程序完全陌生。
在 Ubuntu 14.04 上使用 Monodevelop 进行开发,Mongodb 的版本是 3.2.10:
目前我的代码有如下 POCO:
public class User
public String Name get; set;
public DateTime LastModifiedAt get; set;
public DateTime LastSyncedAt get; set;
public User ()
已经能够创建集合并添加用户。
如何找到 LastModifiedAt 时间戳大于 LastSyncedAt 时间戳的用户?搜索了一些,但没有找到答案。
任何建议都会有很大帮助
谢谢
【问题讨论】:
【参考方案1】:还有另一种方法可以做到这一点。首先让我们声明集合:
var collection = Database.GetCollection<BsonDocument>("CollectionName");
现在让我们添加我们的项目:
var pro = new BsonDocument
"gt1", new BsonDocument
"$gt", new BsonArray() "$LastModifiedAt", "$LastSyncedAt"
,
"Name", true ,
"LastModifiedAt", true ,
"LastSyncedAt", true
;
现在让我们添加我们的过滤器:
var filter = Builders<BsonDocument>.Filter.Eq("gt1", true);
我们将汇总我们的查询:
var aggregate = collection.Aggregate(new AggregateOptions AllowDiskUse = true )
.Project(pro)
.Match(filter)
现在我们的查询已经准备好了。我们可以检查我们的查询如下:
var query=aggregate.ToString();
让我们按如下方式运行我们的查询:
var query=aggregate.ToList();
这会在 bson 文档列表中返回所需的数据。
此解决方案适用于 mongo c# driver 3.6 或更高版本。如有任何混淆,请发表评论。希望我能解释一下。
【讨论】:
【参考方案2】:其实也不是很简单。这应该可以通过查询来实现,例如:
var users = collection.Find(user => user.LastModifiedAt > user.LastSyncedAt).ToList();
但不幸的是 MongoDriver 无法翻译这个表达式。 您可以查询所有用户并在客户端进行过滤:
var users = collection.Find(Builders<User>.Filter.Empty)
.ToEnumerable()
.Where(user => user.LastModifiedAt > user.LastSyncedAt)
.ToList();
或者发送json查询,因为MongoDb本身可以做到:
var jsonFliter = "\"$where\" : \"this.LastModifiedAt>this.LastSyncedAt\"";
var users = collection.Find(new JsonFilterDefinition<User>(jsonFliter))
.ToList();
而且,是的,您需要一个 Id - 您的模型类的属性,我没有首先提到它,因为我认为您确实有一个,只是没有发布在问题中。
【讨论】:
这种方法有效,但必须将 Id 字段添加到我的 POCO。是否使用 [BsonId] 属性 这完全是错误的做法。您需要将该比较添加到您的过滤器并在数据库而不是客户端上完成工作。以上是关于在mono中使用c#驱动程序比较mongo集合的两个字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Linq 在 Mongo C# 2.2 驱动程序中查询嵌套列表?