MongoDB 3.4 के साथ आप $objectToArray
. का उपयोग कर सकते हैं और $arrayToObject
$replaceRoot
. के साथ इसे बदलने के लिए:
db.wish.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$concatArrays": [
[{ "k": "a", "v": "$a" }],
{ "$objectToArray": "$z" }
]
}
}
}}
])
या यहां तक कि "a"
. निर्दिष्ट किए बिना भी यह लंबा मंत्र संपत्ति:
db.wish.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$reduce": {
"input": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "r",
"cond": { "$ne": [ "$$r.k", "_id" ] }
}
},
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
{ "$cond": {
"if": { "$gt": [ "$$this.v", {} ] },
"then": { "$objectToArray": "$$this.v" },
"else": ["$$this"]
}}
]
}
}
}
}
}}
])
दोनों उत्पादन करते हैं:
{ "a" : 1, "b" : 2, "c" : 3 }
$concatArrays
. का मज़ेदार उपयोग भविष्य के संस्करणों में आवश्यक नहीं होना चाहिए क्योंकि एक $mergeObjects
. होगा ऑपरेटर जो इसे थोड़ा साफ कर देगा।
लेकिन आप मूल रूप से क्लाइंट कोड में वही काम कर सकते हैं। उदाहरण के लिए जावास्क्रिप्ट में शेल के लिए:
db.wish.find().map( doc => (
Object.assign({ a: doc.a }, doc.z )
))
या "a"
. के बिना संस्करण फिर से:
db.wish.find().map( doc =>
Object.keys(doc).filter(k => k !== '_id').map(k =>
( typeof(doc[k]) === "object" ) ?
Object.keys(doc[k]).map(i => ({ [i]: doc[k][i] }))
.reduce((acc, curr) => Object.assign(acc,curr),{})
: { [k]: doc[k] }
).reduce((acc,curr) => Object.assign(acc,curr),{})
)
समान उत्पादन करता है
{ "a" : 1, "b" : 2, "c" : 3 }