gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:24:16 24 4
gpt4 key购买 nike

如果我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com