C#MongoDB对日期范围的筛选

本文关键字:筛选 范围 日期 C#MongoDB | 更新日期: 2023-09-27 18:28:39

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

或者还有其他方法吗?

C#MongoDB对日期范围的筛选

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

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

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

但是,与其使用性能较差的$where运算符,最好考虑更改数据模型,以包含针对您通常需要的查询的字段。因此,您可能需要添加一个具有日期差值的字段。

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