MongoDB获取文档数组中嵌套数组的总数

时间:2014-11-03 16:23:16

标签: mongodb mongodb-query aggregation-framework

我正在尝试使用聚合框架将嵌套数组与嵌套数组相加,并以排序顺序返回原始文档。

所以这就是我的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问题,但找不到符合我要求或在我的情况下工作的东西。

我最后的选择是自己计算或创建一个新的领域,但如果我可以只运行一个查询,它会让我的生活变得更轻松。

1 个答案:

答案 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'所以它只检索第一个文件,因为文件会重复,否则为每个买家重复。