【问题标题】:MongoDB Get Total Count of Nested Array within an Array Of A DocumentMongoDB获取文档数组中嵌套数组的总数
【发布时间】:2023-03-05 21:42:01
【问题描述】:

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

这就是我的文档的样子:

myColl: {
 _id: 123,
 fruits: [{
   name: apple,
   buyers: [{buyer1}, {buyer2}]
  },
  {
   name: banana,
   buyers: [{buyer1}, {buyer2}, {buyer3}]
 ]
}

如您所见,fruits 是 myColl 文档中的子文档数组,buyers 是 fruits 中的另一个子文档数组。

我想要的是计算文档中所有水果的买家数组。所以上述文件的买家总数应该是“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 问题,但找不到与我的案例匹配或有效的内容。

我最后的手段是自己计算或创建一个新字段来做,但如果我可以运行查询,这将使我的生活变得更轻松。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2021-05-01
      • 2017-04-28
      相关资源
      最近更新 更多