需要从MongoDB中的最新时间戳和最新tiemstamp-N分钟获取间隔文档
我在需要从MongoDB中的最新时间戳和最新tiemstamp-N分钟获取间隔文档,mongodb,python-2.7,mongodb-query,Mongodb,Python 2.7,Mongodb Query,我在mongodb集合中有文档,每个文档都有时间戳(字段名=过期) 我需要获取集合中最新时间戳与最新时间戳-90分钟之间的所有文档 比如说, 目前的时钟时间是下午4点 Mongodb中最新文档的时间戳为2pm 我需要在2pm和12.30pm 我找到的所有答案都提供了对当前时钟时间内以及在此之前90分钟内的文档的查询。(在本例中,时间为2.30PM至4pm) 我可以在两个查询中完成它,在第一个查询中,我从Mongodb获取最新的timestamp,然后发出第二个查询,匹配timestamp和90分
mongodb
集合中有文档,每个文档都有时间戳(字段名=过期)
我需要获取集合中最新时间戳
与最新时间戳-90
分钟之间的所有文档
比如说,
目前的时钟时间是下午4点
Mongodb
中最新文档的时间戳为2pm
我需要在2pm
和12.30pm
我找到的所有答案都提供了对当前时钟时间内以及在此之前90分钟内的文档的查询。(在本例中,时间为2.30PM至4pm
)
我可以在两个查询中完成它,在第一个查询中,我从Mongodb
获取最新的timestamp
,然后发出第二个查询,匹配timestamp
和90分钟以前的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
pipeline来实现这一点
如果已经发布,请提供答案的链接
谢谢
编辑:我使用的是Mongodb 2.4
它非常简单,可以使用聚合管道来完成。您不需要执行昂贵的$sort
或$unwind
操作。一种方法是
- 将所有记录聚集在一起,将记录累积到名为
result
的数组中。在接下来的步骤中,我们将遍历此数组,以仅保留我们感兴趣的记录。目前,它将保存收藏中的所有记录。这样做是为了获得整个集合的expires
字段
- 通过数组,进入那些有其
过期
字段的记录(最大过期
减()90
分钟(5400000ms
)
- 包含匹配记录的结果数组
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
一个字段,其中包含一个布尔值
以指示过期
字段是否符合我们的标准
$match
标记为可选择的所有文档
修改的方法
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}}
])
对于mongodb 2.6及以上版本,您的答案是正确的。这是正确的,但我应该提到,我使用的是mongodb 2.4$编校运算符在2.6中引入。mongodb 2.4中有没有办法做到这一点?@KouBagade-用一种解决版本<2.6
问题的方法更新了答案。2.4中是否存在$$ROOT变量?我在文档中找不到它的任何参考。我相信它是在版本2中引入的。6@KouBagade-已更新我的答案。您需要在文档中明确指定字段,而不是$$ROOT
变量以及expires
。我强烈建议您升级您的mongodb
版本。@KouBagade-请随时编辑我的答案,并更正它-如果您仍然面临任何版本兼容性问题,并且您觉得只需对答案进行一点小的更改即可更正。