在单声道中使用 c# 驱动程序比较 mongo collection 的两个字段
Comparing two fields of mongo collection using c# driver in mono
我对 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 ()
{
}
}
已经能够创建 collection 并添加用户。
如何找到 LastModifiedAt 时间戳大于 LastSyncedAt 时间戳的用户?做了一些搜索,但未能找到答案。
任何建议都会有很大的帮助
谢谢
其实不是很简单。这应该可以通过查询来实现,例如:
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 - 属性 用于你的模型 class,我没有首先提到它,因为我认为你有一个,只是没有张贴在问题中.
还有另一种方法。首先让我们声明集合:
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();
这与 return bson 文档列表中所需的数据。
此解决方案适用于 mongo c# 驱动程序 3.6 或更高版本。如有任何混淆,请发表评论。希望我能解释一下。
我对 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 ()
{
}
}
已经能够创建 collection 并添加用户。
如何找到 LastModifiedAt 时间戳大于 LastSyncedAt 时间戳的用户?做了一些搜索,但未能找到答案。
任何建议都会有很大的帮助
谢谢
其实不是很简单。这应该可以通过查询来实现,例如:
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 - 属性 用于你的模型 class,我没有首先提到它,因为我认为你有一个,只是没有张贴在问题中.
还有另一种方法。首先让我们声明集合:
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();
这与 return bson 文档列表中所需的数据。
此解决方案适用于 mongo c# 驱动程序 3.6 或更高版本。如有任何混淆,请发表评论。希望我能解释一下。