需要从MongoDB中的最新时间戳和最新tiemstamp-N分钟获取间隔时间的文档

时间:2015-12-17 00:25:09

标签: mongodb python-2.7 mongodb-query

我在mongodb集合中有文档,每个文档都有timestampfield_name = expires)。

我需要获取收集中最新timestamp和最新timestamp-90分钟之间的所有文档。

例如,

当前时钟时间是下午4点。

Mongodb中最新文档的时间戳为2pm

我需要在2pm12.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

1 个答案:

答案 0 :(得分:1)

它很简单,可以使用聚合管道完成。您无需进行昂贵的$sort$unwind操作。一种方法是,

  • $group将所有记录放在一起,在名为result的数组中累积记录。在后续步骤中,我们将遍历此数组以仅保留我们感兴趣的记录。现在,它将保存集合中的所有记录。这样做是为了获取整个集合的$max expires字段。

  • $redact通过数组$$DESCEND进入那些expire字段$gte最大expires减去的记录($subtract90分钟(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}}
])