我在mongodb
集合中有文档,每个文档都有timestamp
(field_name
= expires
)。
我需要获取收集中最新timestamp
和最新timestamp-90
分钟之间的所有文档。
例如,
当前时钟时间是下午4点。
Mongodb
中最新文档的时间戳为2pm
。
我需要在2pm
和12.30pm
之间获取文件
我找到的所有答案都提供了对当前时钟时间和90 minutes
之前的文档的查询。 (在此示例中,它将是2.30PM to 4 PM
)
我可以在2个查询中执行此操作,在第一个查询中,我从timestamp
获取最新Mongodb
,然后发出与timestamp
和{{1}之间的文档匹配的第二个查询} 90 minutes
。
timestamp
并计算
pipeline =[]
sort = {
"$sort": {
"expires": -1
}
}
limit = {
"$limit" : 1
}
pipeline.append(sort)
pipeline.append(limit)
第二个查询将是
end_time = (result['result'][0])['expires']
start_time = end_time - datetime.timedelta(minutes=90)
有没有办法在使用pipeline = []
match = {
"$match": {
"expires" : {
"$gt" : start_time,
"$lte" : end_time,
"$type": 18,
}
}
}
pipeline.append(match)
管道的单一查询中执行此操作?
如果已经发布,请提供答案的链接。
由于
修改:我正在使用aggregation
答案 0 :(得分:1)
它很简单,可以使用聚合管道完成。您无需进行昂贵的$sort
或$unwind
操作。一种方法是,
$group
将所有记录放在一起,在名为result
的数组中累积记录。在后续步骤中,我们将遍历此数组以仅保留我们感兴趣的记录。现在,它将保存集合中的所有记录。这样做是为了获取整个集合的$max
expires
字段。
$redact
通过数组$$DESCEND
进入那些expire
字段$gte
(最大expires
减去的记录($subtract
)90
分钟(5400000ms
))。
$project
包含匹配记录的结果数组。
Pipeline
,您可以轻松插入python
代码:
db.collection.aggregate([
{$group:{"_id":null,
"result":{$push:"$$ROOT"},
"maxTimeStamp":{$max:"$expires"}}},
{$redact:{$cond:[{$gte:[{$ifNull:["$expires","$maxTimeStamp"]},
{$subtract:["$maxTimeStamp",5400000]}]},
"$$DESCEND",
"$$PRUNE"]}},
{$project:{"result":1,"_id":0}}
])
对于$redact
阶段不可用的早期版本,您需要使用替代方法,$unwind
和$project
,
$unwind
结果数组。$project
一个字段,其中包含boolean
值,表示expires
字段是否符合我们的条件。$match
所有标有selectable
。修改方法,
db.collection.aggregate([
{$group:{"_id":null,
"result":{$push:{"expires":"$expires"}},
"maxTimeStamp":{$max:"$expires"}}},
{$unwind:"$result"},
{$project:{"selectable":{$cond:[{$gte:["$result.expires",
{$subtract:["$maxTimeStamp",5400000]}]},
true,
false]},"result":1}},
{$match:{"selectable":true}},
{$project:{"result":1,"_id":0}}
])