获取集合和子文档中所有键的名称

Gui*_*ira 5 javascript mongodb mongodb-query aggregation-framework

我需要从我的集合中获取所有字段名称,包括子文档中的字段.我目前正在运行此命令并仅获取根字段的名称.我如何获得所有字段名称?

我的收藏看起来像这样:

"UserId" : 11111,
"Personal" : {
    "Email" : "email@gmail.com",
    "FirstName" : "Name",
    "LastName" : "Last"
},
"Car" : {
    "CarType" : "NULL"
}
Run Code Online (Sandbox Code Playgroud)

这是命令

var mr = db.runCommand({
"mapreduce" : "myCollection",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "myCollection" + "_keys"
})

db[mr.result].distinct("_id")
Run Code Online (Sandbox Code Playgroud)

我想要这个结果:

UserId,Personal.Email,Personal.FirstName,Personal.LastName,Car.CarType

Ash*_*shh 3

您可以使用下面aggregation

db.collection.aggregate([
  { "$project": { "data": { "$objectToArray": "$$ROOT" }}},
  { "$project": {
    "data": {
      "$map": {
        "input": "$data",
        "in": {
          "$cond": [
            { "$eq": [{ "$type": "$$this.v" }, "object"] },
            { "k": "$$this.k", "v": { "$objectToArray": "$$this.v" }},
            "$$this"
          ]
        }
      }
    }
  }},
  { "$project": {
    "data": {
      "$map": {
        "input": "$data",
        "as": "d",
        "in": {
          "k": "$$d.k",
          "v": {
            "$map": {
              "input": { "$cond": [{ "$eq": [{ "$type": "$$d.v" }, "array"] }, "$$d.v", []] },
              "as": "v",
              "in": { "v": { "$concat": ["$$d.k", ".", "$$v.k"] }}
            }
          }
        }
      }
    }
  }},
  { "$project": {
    "finalKeys": {
      "$concatArrays": [
        { "$reduce": {
          "input": "$data.v",
          "initialValue": [],
          "in": { "$concatArrays": ["$$value", "$$this.v"] }
        }},
        "$data.k"
      ]
    }
  }}
])
Run Code Online (Sandbox Code Playgroud)

输出

[
  {
    "finalKeys": [
      "Personal.Email",
      "Personal.FirstName",
      "Personal.LastName",
      "Car.CarType",
      "_id",
      "UserId",
      "Personal",
      "Car"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)