首页 文章

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

提问于
浏览
0

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

所以这是我的文档的样子:

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

    是的,在经过大量的修修补补后,我遇到了两个问题:

    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',以便它只检索第一个文档,因为文档会重复,否则为每个买家重复 .

相关问题