我正在尝试使用聚合框架将嵌套数组与嵌套数组相加,并以排序顺序返回原始文档。
所以这就是我的doc的样子:
myColl: {
_id: 123,
fruits: [{
name: apple,
buyers: [{buyer1}, {buyer2}]
},
{
name: banana,
buyers: [{buyer1}, {buyer2}, {buyer3}]
]
}
正如你可以在myColl文档中包含子文档的数组,而买家是水果中的一系列子文档。
我想要的是计算所有水果的文档中的买家数组。因此,上述文件的买家总数应为'5'。
然后我想要总买家对myColl中的所有文件进行排序。我尝试了一些事情,似乎无法做到正确:
db.myColl.aggregate([
{$unwind: '$fruits'},
{$unwind: '$fruits.buyers'},
{$group: {
_id: '$fruits.buyers',
totalBuyers: {$sum: '1'},
docs: {$push: '$$ROOT'}
}},
{$sort: {'totalBuyers': 1}}])
这不会给我想要的结果,而且totalBuyers总是0.加上它会给我更多的结果,然后是myColl的总数。我猜它与'_id'字段有关。
我已经查看了其他一些SO问题,但找不到符合我要求或在我的情况下工作的东西。
我最后的选择是自己计算或创建一个新的领域,但如果我可以只运行一个查询,它会让我的生活变得更轻松。
答案 0 :(得分:0)
对,经过大量的修修补补后,我遇到了两个问题:
1)我的号码附近有引号,愚蠢的错误。 2)我需要通过$$ ROOT._id明确分组
所以这是有效的解决方案:
db.myColl.aggregrate(
[
{$unwind: '$fruits'},
{$unwind: '$fruits.buyers'},
{$group: {
_id: '$$ROOT._id',
doc: {$first: '$$ROOT'},
totalBuyers: {$sum: 1}
}},
{$sort: {'totalBuyers': -1}},
{$limit : 10 }
]
)
请注意,我必须使用' $ first'而不是' $ push'所以它只检索第一个文件,因为文件会重复,否则为每个买家重复。