MongoDB-带条件的对象过滤器数组

时间:2018-10-22 20:45:21

标签: mongodb mongodb-query aggregation-framework

我的收藏夹中有一个像这样的json文件:

[
   {
      "change":"00001",
      "patchset":"4"
   },
   //etc
]

两个不同的对象可以具有相同的“更改”属性。 因此,首先我想按“更改”属性对它们进行分组,在此组中,我希望“补丁集”属性的最大值。我已经设法通过此命令轻松做到这一点

db.collections.aggregate([{$group:{_id:"$change",patchset_max:{$max:"$patchset"}}}])

但是然后,这就是我丢失的地方,有了这个最大补丁集,我想获取所有对象,其中object.patchset = max_patchset但仍在组数组中。

我尝试使用$ filter和$ match,然后嵌套$ group,但是没有用,

你们有什么主意吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您需要使用$$ROOT(这是代表整个文档的特殊变量)来获取每个组的所有项目,然后可以使用$addFields覆盖现有数组,并使用$filter仅获取patchset等于patchset_max的文档。试试:

db.collection.aggregate([
    {
        $group: {
            _id: "$change",
            patchset_max:{$max:"$patchset"},
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $addFields: {
            docs: {
                $filter: {
                    input: "$docs",
                    as: "doc",
                    cond: {
                        $eq: [ "$patchset_max", "$$doc.patchset" ]
                    }
                }
            }
        }
    }
])

示例游乐场here

答案 1 :(得分:2)

编辑上面的答案是正确的,但是如果在Mongo 3.2上,则可以选择

db.collection.aggregate([{ 
    $group: { _id: "$change", patchset: { $push: "$$ROOT" }, patchset_max:{ $max:"$patchset" } } 
},{ 
    $project: {
        patchset: {
            $filter: { 
                input: '$patchset',
                as: 'ps',
                cond: { $eq: ['$$ps.patchset', '$patchset_max'] }
            }
        }
    }
}])