हाँ वास्तव में, फ़ील्ड "territories"
डेटाबेस संदर्भ
की एक सरणी है और not the actual documents
. DBRefs
ऐसी वस्तुएं हैं जिनमें contain information with which we can locate the actual documents
।
उपरोक्त उदाहरण में, आप इसे स्पष्ट रूप से देख सकते हैं, नीचे दी गई मोंगो क्वेरी को सक्रिय करें:
db.maps.find({"_id":ObjectId("542489232436657966204394")}).forEach(function(do
c){print(doc.territories[0]);})
यह दस्तावेज़ के बजाय स्वयं DBRef ऑब्जेक्ट को प्रिंट करेगा:
o/p: DBRef("territories", ObjectId("5424892224366579662042e9"))
तो, '$sum': '$territories.name'
,'$sum': '$territories.area'
आपको '0' दिखाएगा क्योंकि name
. जैसी कोई फ़ील्ड नहीं है या area
।
इसलिए $territories.name
. जैसा कुछ करने से पहले आपको किसी दस्तावेज़ के इस संदर्भ को हल करना होगा
आप जो चाहते हैं उसे प्राप्त करने के लिए, आप map()
. का उपयोग कर सकते हैं फ़ंक्शन, चूंकि एकत्रीकरण और न ही मानचित्र-समर्थन उप प्रश्नों को कम करता है, और आपके पास पहले से ही एक स्व-निहित map
है दस्तावेज़, इसके territories
. के संदर्भ में ।
हासिल करने के लिए कदम:
a) get each map
b) resolve the `DBRef`.
c) calculate the total area, and the number of territories.
d) make and return the desired structure.
मोंगो शेल स्क्रिप्ट:
db.maps.find().map(function(doc) {
var territory_refs = doc.territories.map(function(terr_ref) {
refName = terr_ref.$ref;
return terr_ref.$id;
});
var areaSum = 0;
db.refName.find({
"_id" : {
$in : territory_refs
}
}).forEach(function(i) {
areaSum += i.area;
});
return {
"id" : doc.fileName,
"noOfTerritories" : territory_refs.length,
"areaSum" : areaSum
};
})
ओ/पी:
[
{
"id" : "importFile1.json",
"noOfTerritories" : 2,
"areaSum" : 1906609
},
{
"id" : "importFile2.json",
"noOfTerritories" : 1,
"areaSum" : 0
}
]
Map-Reduce
फ़ंक्शंस को DBRefs
. को हल करने के लिए उपयोग नहीं किया जाना चाहिए और न ही किया जा सकता है सर्वर साइड में। देखें कि दस्तावेज़ीकरण का क्या कहना है:
इसके अलावा, एक reduce
फ़ंक्शन भले ही उपयोग किया गया हो (जो कभी भी काम नहीं कर सकता) आपकी समस्या के लिए कभी भी कॉल नहीं किया जाएगा, क्योंकि समूह w.r.t "fileName"
या "ObjectId"
आपके डेटासेट में हमेशा एक ही दस्तावेज़ होगा।