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

问题描述 投票:5回答:2

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

我的收藏看起来像这样:

"UserId" : 11111,
"Personal" : {
    "Email" : "[email protected]",
    "FirstName" : "Name",
    "LastName" : "Last"
},
"Car" : {
    "CarType" : "NULL"
}

这是命令

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")

我想要这个结果:

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

javascript mongodb mongodb-query aggregation-framework
2个回答
2
投票

你可以在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"
      ]
    }
  }}
])

产量

[
  {
    "finalKeys": [
      "Personal.Email",
      "Personal.FirstName",
      "Personal.LastName",
      "Car.CarType",
      "_id",
      "UserId",
      "Personal",
      "Car"
    ]
  }
]

4
投票

在简单的Javascript中,您可以通过查看对象,它们的键和它们的嵌套对象来采用迭代和递归方法。

function getKeys(object) {
    if (!object || typeof object !== 'object') {
        return [];
    }
    if (Array.isArray(object)) {
        return object.reduce((r, o) => [...r, ...getKeys(o)], []);
    }
    return Object.keys(object).reduce((r, k) => [...r, k, ...getKeys(object[k])], []);
}

var object = { UserId: 11111, Personal: { Email: "[email protected]",  FirstName: "Name", LastName: "Last" }, Car: { CarType: "NULL" }, array: [{ foo: '', bar: '' }, { foo: '', bar: '' }] };

console.log(getKeys(object));
© www.soinside.com 2019 - 2024. All rights reserved.