mongodb:查询两个日期字段之间的时间段

标签 mongodb mongodb-query aggregation-framework

如果我的 mongoDB 中保存了以下模式的文档:

{
  createdDate: Date,
  lastUpdate: Date
}

是否可以查询创建和最后更新之间的时间间隔的文档,例如超过一天?

最佳答案

最好的选择是使用 $redact聚合管道阶段:

db.collection.aggregate([
    { "$redact": {
        "$cond": {
            "if": {
                "$gt": [
                    { "$subtract": [ "$lastUpdate", "$createdDate" ] },
                    1000 * 60 * 60 * 24
                ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

因此,您正在查看的毫秒值是一天之内大于毫秒值的差异。 $subtract对差异进行数学计算,当减去两个日期时,返回以毫秒为单位的差异。

$redact 运算符将逻辑表达式作为“if”,并且在该条件为 true 的情况下,它会采取“then”中的操作,即 $$KEEP 文档。当它为 false 时,文档会从带有 $$PRUNE 的结果中删除。

请注意,由于这是一个逻辑条件,而不是一个设定值或一个值范围,因此不使用“索引”。

由于聚合管道中的操作是本地编码的,因此这是您可以获得的最快执行此类语句的速度。

替代方案是使用 $where 进行 JavaScript 评估.这采用需要类似地返回 truefalse 值的 JavaScript 函数表达式。在 shell 中你可以像这样简写:

db.collection.find(function() {
    return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
       > ( 1000 * 60 * 60 * 24 );
})

同样的事情,除了 JavaScript 评估需要解释并且运行速度比 .aggregate() 等价物慢得多。同样的道理,这种表达式也不能使用索引来优化性能。

为获得最佳结果,请将差异存储在文档中。然后您可以直接对该属性进行查询,当然您也可以对其进行索引。

关于mongodb:查询两个日期字段之间的时间段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36176905/

相关文章:

Mongodb auth with servicestack 抛出缺少方法异常

mongodb - 一个mongodb数组字段可以保存多少个BSON ObjectId

java - 在嵌套文档中按查询分组

mongodb - 如何匹配两个字段都不存在

javascript - 创建一个新文档,使用聚合对具有特定值的字段进行求和

mongodb - 如何将 MongoDB 集合转换为以元素值为键的对象?

mongodb - 用于库存管理系统的 SQL 与 NoSQL

c# - 驱动程序中缺少 MongoDB 驱动程序(查询生成器)?

c# - 具有组和项目的 MongoDb C# 驱动程序使用 Aggregate() 查询给出异常

mongodb - 访问数组中嵌入文档中的值