我有一个包含以下结构文档的集合:

{
  "foo": [
    {
      "bar": [
        {
          "baz": [
            1,
            2,
            3
          ]
        },
        {
          "baz": [
            4,
            5,
            6
          ]
        }
      ]
    },
    {
      "bar": [
        {
          "baz": [
            7,
            8,
            9
          ]
        },
        {
          "baz": [
            10,
            11,
            12
          ]
        }
      ]
    }
  ]
}

我想得到一个平面数组,包含所有“bar”数组的所有值。换句话说,我想要的结果看起来像[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
我该怎么做?

最佳答案

您可以使用$reduce运算符使用下面的聚合

db.collection.aggregate([
  { "$project": {
    "array": {
      "$reduce": {
        "input": {
          "$reduce": {
            "input": "$foo",
            "initialValue": [],
            "in": { "$concatArrays": ["$$this.bar", "$$value"] }
          }
        },
        "initialValue": [],
        "in": { "$concatArrays": ["$$this.baz", "$$value"] }
      }
    }
  }}
])

MongoPlayground
或使用$unwind运算符
db.collection.aggregate([
  { "$unwind": "$foo" },
  { "$unwind": "$foo.bar" },
  { "$unwind": "$foo.bar.baz" },
  { "$group": {
    "_id": "$_id",
    "array": {
      "$push": "$foo.bar.baz"
    }
  }}
])

MongoPlayground

09-25 16:23