यदि metadata
. में तत्वों की स्थिति फ़ील्ड और एम्बेडेड दस्तावेज़ों की कुंजी ज्ञात है और फिर आप एकत्रीकरण का उपयोग कर सकते हैं।
db.foo.aggregate([
{
$project : {
data : {
"Language" : {
$arrayElemAt : ["$metadata", 0]
},
"City" : {
$arrayElemAt : ["$metadata", 1]
},
"Gender" : {
$arrayElemAt : ["$metadata", 2]
}
}
}
},
{
$project : {
metadata : {
Language : "$data.Language.value",
City : "$data.City.value",
Gender : "$data.Gender.value"
}
}
}
])
परिणाम :
{ "_id" : "213412323234", "metadata" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }
यदि ऊपर उल्लिखित दो पूर्व शर्तो में से कोई भी ज्ञात नहीं है, तो आप mapReduce
।
db.foo.mapReduce(function () {
var key = this._id;
var metadata = this.metadata;
var valueEmit = {};
for (var i = 0; i < metadata.length; i++) {
valueEmit[metadata[i].id] = metadata[i].value;
}
emit(key, valueEmit)
},
function(key, values) {
// do nothing as it won't be called
// for if value is only one
// for a key
},
{
out : {replace : "foobar"}
})
परिणाम :
> db.foobar.find()
{ "_id" : "213412323234", "value" : { "Language" : "EN", "City" : "New York", "Gender" : "Male" } }
ध्यान दें कि कुंजी को value
में बदल दिया गया है मेटाडेटा के बजाय। इसे $project
. का उपयोग करके आसानी से ठीक किया जा सकता है aggregation
. में foobar
. पर संग्रह।