【问题标题】:C# MongoDB filter on date rangeC# MongoDB 过滤日期范围
【发布时间】:2013-08-22 09:32:06
【问题描述】:

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

我尝试使用 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 datetime mapreduce


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2019-02-19
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多