如何获取嵌套MongoDB文档的钥匙



我有这样的数据,我需要此MongoDB集合中的所有键,例如property1,property2等。

{
    "_id": 0,
    "config": [{
            "property1":"a",
            "property2": "b",
            "property3": "c",
            "property4": "d"
        },
        {
            "property1": "a",
            "property2": "bb",
            "property3": "cc",
            "property4": "d",
            "ispropert5": true
        },
        {
            "property1": "a",
            "property2": "b",
            "property3": "c",
            "property4": "ddd",
            "ispropert5": false,
            "ispropert6": false
        }
    ],
    "entity": "123asdf",
    "url": "",
    "createdDate": 1
}

我尝试了

db.COLLECTION_NAME.find({},{config:1}).forEach(function(doc){Object.keys(doc).forEach(function(key){innerkeys[key]=1})}):

您可以使用$ objectToaray动态读取对象键,然后用$ concatrays运行$ redial以合并结果:

db.collection.aggregate([
  {
    $project: {
      properties: {
        $reduce: {
          input: "$config",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              {
                $map: {
                  input: {
                    $objectToArray: "$$this"
                  },
                  in: "$$this.k"
                }
              }
            ]
          }
        }
      }
    }
  }
])

输出:

[
  {
    "_id": 0,
    "properties": [
      "property3",
      "property4",
      "property1",
      "property2",
      "property4",
      "ispropert5",
      "property1",
      "property2",
      "property3",
      "property2",
      "property3",
      "property4",
      "ispropert5",
      "ispropert6",
      "property1"
    ]
  }
]

mongo游乐场

您可以使用mergeObjects$reduce的帮助下将数组中的对象合并到一个对象,使用objectToArray将该对象转换为数组,然后使用$map

db.collection.aggregate([
  {
    "$project": {
      "_id": 0,
      keys: {
        "$map": {
          "input": {
            "$objectToArray": {
              $reduce: {
                input: "$config",
                initialValue: {},
                in: {
                  "$mergeObjects": "$$this"
                }
              }
            }
          },
          "in": "$$this.k"
        }
      }
    }
  }
])

输出:

[
  {
    "keys": [
      "property2",
      "property3",
      "property4",
      "ispropert5",
      "ispropert6",
      "property1"
    ]
  }
]

Playground

另一种做相同的方式

db.collection.aggregate([
  {
    "$unwind": "$config"
  },
  {
    $group: {
      _id: null,
      keys: {
        $mergeObjects: "$config"
      }
    }
  },
  {
    "$project": {
      keys: {
        $map: {
          input: {
            $objectToArray: "$keys"
          },
          in: "$$this.k"
        }
      }
    }
  }
])

最新更新