我有这样的数据,我需要此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"
}
}
}
}
])