需要从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-请随时
编辑
我的答案,并更正它-如果您仍然面临任何版本兼容性问题,并且您觉得只需对答案进行一点小的更改即可更正。