Burada belirtildiği gibi bunu yapmanın en iyi yolu mongod 3.4.4+ olduğunu düşünüyorum ama $unwind
operatörü kullanmadan ve boru hattında sadece iki aşama kullanmadan. Bunun yerine $mergeObjects
ve $objectToArray
operatörlerini kullanabiliriz .
In $group
aşamada, kullandığımız $mergeObjects
anahtar / değer koleksiyonundaki tüm belgeler nereli tek belge dönmek operatörü.
Sonra $project
kullandığımız yer $map
ve $objectToArray
anahtarları iade etmek.
let allTopLevelKeys = [
{
"$group": {
"_id": null,
"array": {
"$mergeObjects": "$$ROOT"
}
}
},
{
"$project": {
"keys": {
"$map": {
"input": { "$objectToArray": "$array" },
"in": "$$this.k"
}
}
}
}
];
Eğer iç içe geçmiş bir dokümanımız varsa ve anahtarları da almak istiyorsak, bu yapılabilir. Basit olması için, aşağıdaki gibi basit gömülü belgeye sahip bir belgeyi ele alalım:
{field1: {field2: "abc"}, field3: "def"}
{field1: {field3: "abc"}, field4: "def"}
Aşağıdaki boru hattı tüm anahtarları verir (alan1, alan2, alan3, alan4).
let allFistSecondLevelKeys = [
{
"$group": {
"_id": null,
"array": {
"$mergeObjects": "$$ROOT"
}
}
},
{
"$project": {
"keys": {
"$setUnion": [
{
"$map": {
"input": {
"$reduce": {
"input": {
"$map": {
"input": {
"$objectToArray": "$array"
},
"in": {
"$cond": [
{
"$eq": [
{
"$type": "$$this.v"
},
"object"
]
},
{
"$objectToArray": "$$this.v"
},
[
"$$this"
]
]
}
}
},
"initialValue": [
],
"in": {
"$concatArrays": [
"$$this",
"$$value"
]
}
}
},
"in": "$$this.k"
}
}
]
}
}
}
]
Biraz çaba sarf ederek, öğelerin de nesne olduğu bir dizi alanındaki tüm alt belgelerin anahtarını alabiliriz.