我是C#MongoDB驱动程序的新用户,对于在日期范围内过滤对象有疑问。
我的收藏品有很多条目格式如下
{
"_id" : ObjectId("51fa6ab684cc97132cfa4616"),
"startDate" : ISODate("2013-07-16T00:00:00Z"),
"endDate" : ISODate("2013-07-26T00:00:00Z"),
"company" : "ABC"
"amount" : 15
}
我想编写一个查询来根据以下内容过滤集合:(“endDate” - “startDate”)< 10,表示结果对象的结束日期应小于开始日期的10天。
我尝试使用MongoDB.Driver.Builders.Query类,但没有任何运气。是否可以使用MongoDB.Driver.Builders.Query.Where()进行存档?因为我想与其他查询联系起来:
var amountQuery = Query.GT("amount", 10).LT(20);
var dateRangeQuery = // Query.XXX()....
var query = Query.And(amountQuery, dateRangeQuery );
var result = collection.Find(query);
或者还有其他方法吗?
答案 0 :(得分:0)
如果不使用$where
(docs)运算符,则无法对数据执行操作,例如在使用传统find
调用时比较两个字段的值。如果您使用$where
,则MongoDb无法利用$where
操作中字段的索引。此外,它需要使用JavaScript引擎来执行代码,这进一步影响了性能。
假设您使用的是MongoDb 2.4或更高版本:
var dateRangeQuery=Query.Where(
new BsonJavaScript("this.endDate - this.startDate < 10"))
但是,最好不要使用效果不佳的$where
运算符,而是最好考虑更改数据模型以包含针对您通常需要的查询的字段。因此,您可能希望添加具有日期差异值的字段。
可以使用聚合框架构建此查询,但它通常不是常见查询的正确解决方案,目前还没有设计用于处理返回的大型结果集和文档(因此名称)。例如Here是使用$subtract
的示例。