日期范围内的C#MongoDB过滤器

时间:2013-08-22 09:32:06

标签: c# mongodb datetime mapreduce

我是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);

或者还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

如果不使用$wheredocs)运算符,则无法对数据执行操作,例如在使用传统find调用时比较两个字段的值。如果您使用$where,则MongoDb无法利用$where操作中字段的索引。此外,它需要使用JavaScript引擎来执行代码,这进一步影响了性能。

假设您使用的是MongoDb 2.4或更高版本:

var dateRangeQuery=Query.Where(
             new BsonJavaScript("this.endDate - this.startDate < 10"))

但是,最好不要使用效果不佳的$where运算符,而是最好考虑更改数据模型以包含针对您通常需要的查询的字段。因此,您可能希望添加具有日期差异值的字段。

可以使用聚合框架构建此查询,但它通常不是常见查询的正确解决方案,目前还没有设计用于处理返回的大型结果集和文档(因此名称)。例如Here是使用$subtract的示例。