MongoDB - 在不同级别的字段之间获得$ max

时间:2016-03-16 14:10:32

标签: mongodb mongodb-query aggregation-framework

我有一个MongoDB集合,其中包含此(简化)表单的文档

{
    "_id": "Doc"
    "created": NumberLong("1422526079335")
}

此外,此文档可能还有一个edited字段

{
    "_id": "Doc"
    "created": NumberLong("1422526079335")
    "edited": {
        "date": NumberLong("1458128507498")
    }
}

我需要的是获取这些文档子集的最新时间戳(creatededited.date之间),以匹配特定条件。

到目前为止,我所获得的是获取最新的created时间戳

db.myCollection.aggregate([ { $match: { ... } },
                            { $project: { _id:0, created: 1 } },
                            { $group: { _id: 'latest', latest: { $max: '$created' } } }
                          ])

返回

{ "_id" : "latest", "latest" : NumberLong("1422526079335") }

如何在上面的edited.date逻辑中针对$max整合检查?或者是另一种解决方案吗?谢谢你提前!

2 个答案:

答案 0 :(得分:2)

试试这个脚本。这是一个简单的$max运营商。

我在集合中有以下文件

{ 
    "_id" : "Doc", 
    "created" : NumberLong(1422526079335), 
    "edited" : {
        "date" : NumberLong(1458128507498)
    }
}
{ 
    "_id" : "Doc1", 
    "created" : NumberLong(1422526079335)
}

尝试运行以下查询:

db.doc.aggregate([
  { 
     $match: { ... } 
  },
  {
     $project:{
       latest:{ $max:["$created", "$edited.date"]}
     }
  }
])

输出将是:

{ 
    "_id" : "Doc", 
    "latest" : NumberLong(1458128507498)
}
{ 
    "_id" : "Doc1", 
    "latest" : NumberLong(1422526079335)
}

答案 1 :(得分:1)

你可以在上一个$ project管道中使用$ cond - lastModifedDate 制作技巧: - )

db.ill.aggregate([{
    $project:{
        lastModifedDate:{
              $cond: { 
                 if: { $gte: [ "$created", "$edited.date"] }, 
                 then: "$created", else: "$edited.date" }
        }}}])