我的收藏夹中有一个像这样的json文件:
[
{
"change":"00001",
"patchset":"4"
},
//etc
]
两个不同的对象可以具有相同的“更改”属性。 因此,首先我想按“更改”属性对它们进行分组,在此组中,我希望“补丁集”属性的最大值。我已经设法通过此命令轻松做到这一点
db.collections.aggregate([{$group:{_id:"$change",patchset_max:{$max:"$patchset"}}}])
但是然后,这就是我丢失的地方,有了这个最大补丁集,我想获取所有对象,其中object.patchset = max_patchset但仍在组数组中。
我尝试使用$ filter和$ match,然后嵌套$ group,但是没有用,
你们有什么主意吗?
谢谢
答案 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'] }
}
}
}
}])