首页 > 解决方案 > 如何在 MongoDB 中聚合列表?

问题描述

我有一组容器,每个容器都有一组物品。容器的 MongoDB 文档如下所示。如何列出所有容器中的所有项目以及每个项目中的容器名称?

{
    "Container": 28392
    ...
    "Items": [
        {
            "ItemName": "Foo", 
            ...
        }, 
        {
            "ItemName": "Bar", 
            ...
        }
    ]
}

预期输出:

[

     {
          "ItemName": "Foo",
          "Container": 28392 
           ...
     }, 
     {
          "ItemName": "Bar",
          "Container": 28392 
           ...
     },
     {
          "ItemName": "Baz", 
          "Container": 52892 
           ...
     }

 ]

这可以通过某种放松来实现吗?如果是这样,我将如何汇总?

标签: mongodb

解决方案


之后unwind你可以使用project舞台做你想做的事:

db.collection.aggregate([
  {
    $unwind: "$Items"
  },
  {
    $project: {
      Container: "$Container",
      ItemName: "$Items.ItemName"
    }
  }
])

操场:

https://mongoplayground.net/p/H-aWx07pCDt

或者,如果您的 mongodb 版本等于或大于 4.2,您可以使用replaceWith with mergeObjects,获取 items 数组中的所有字段。

db.collection.aggregate([
  {
    $unwind: "$Items"
  },
  {
    $replaceWith: {
      $mergeObjects: [
        {
          Container: "$Container"
        },
        "$Items"
      ]
    }
  }
])

操场:

https://mongoplayground.net/p/E5KqFlNq1CL

输入:

[
  {
    "Container": 28392,
    "Items": [
      {
        "ItemName": "Foo",
        "ItemDesc": "Foo desc"
      },
      {
        "ItemName": "Bar",
        "ItemDesc": "Bar desc"
      }
    ]
  }
]

输出:

[
  {
    "Container": 28392,
    "ItemDesc": "Foo desc",
    "ItemName": "Foo"
  },
  {
    "Container": 28392,
    "ItemDesc": "Bar desc",
    "ItemName": "Bar"
  }
]

推荐阅读