MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगो नेटिव क्वेरी का उपयोग करके MongoDB DBRef सरणी को हल करना और हल किए गए दस्तावेज़ों पर काम करना

हाँ वास्तव में, फ़ील्ड "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" आपके डेटासेट में हमेशा एक ही दस्तावेज़ होगा।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB दस्तावेज़ को फिर से आकार देना

  2. MongoDb बल्क ऑपरेशन आईडी प्राप्त करें

  3. MongoDB के साथ JSON का उपयोग करना?

  4. क्षेत्र द्वारा MongoDB कुल मौजूद है

  5. MongoDB+Java:उपयोगकर्ता दस्तावेज़ में क्रेडेंशियल अनुपलब्ध हैं