如果我的 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 评估.这采用需要类似地返回 true
或 false
值的 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/