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

नेवला - .populate . के साथ नेस्टेड वस्तु तक पहुँचना

आप जो चाहते हैं उसका सरलीकृत संस्करण यहां दिया गया है।

सेटअप करने के लिए बुनियादी डेटा, पहले "छात्र":

{ 
   "_id" : ObjectId("53aa90c83ad07196636e175f"), 
   "name" : "Bill",
   "rollNo" : 1,
   "class" : 12 
},
{ 
    "_id" : ObjectId("53aa90e93ad07196636e1761"),
    "name" : "Ted",
    "rollNo" : 2,
    "class" : 12
}

और फिर "टीम" संग्रह:

{ 
    "_id" : ObjectId("53aa91b63ad07196636e1762"),
    "name" : "team1",
    "lead" : "me",
    "students" : [ 
        { 
            "block" : 1,
            "status" : "Y",
            "student" : ObjectId("53aa90c83ad07196636e175f")
        },
        { 
            "block" : 2,
            "status" : "N",
            "student" : ObjectId("53aa90e93ad07196636e1761")
        }
    ]
}

आप इसे इस तरह से करते हैं:

var async = require('async'),
    mongoose = require('mongoose');
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/team');

var teamSchema = new Schema({
  name: String,
  lead: String,
  students: [{
    block: Number,
    status: String,
    student: {
      type: Schema.ObjectId, ref: 'Student'
    }
  }]
});

var studentSchema = new Schema({
  name: String,
  rollNo: Number,
  class: Number
});

var Team = mongoose.model( "Team", teamSchema );
var Student = mongoose.model( "Student", studentSchema );

Team.findById("53aa91b63ad07196636e1762")
  .select('students')
  .exec(function(err, team) {
    console.log( team );

    async.forEach(team.students, function(student,callback) {
      Student.populate(
        student,
        { "path": "student" },
        function(err,output) {
          if (err) throw err;
          callback();
        }
      );
    },function(err) {
      console.log( JSON.stringify( team, undefined, 4 ) );
    });

  });

और यह आपको परिणाम देता है:

{
    "_id": "53aa91b63ad07196636e1762",
    "students": [
        {
            "block": 1,
            "status": "Y",
            "student": {
                "_id": "53aa90c83ad07196636e175f",
                "name": "Bill",
                "rollNo": 1,
                "class": 12
            }
        },
        {
            "block": 2,
            "status": "N",
            "student": {
                "_id": "53aa90e93ad07196636e1761",
                "name": "Ted",
                "rollNo": 2,
                "class": 12
            }
        }
    ]
}

आपको वास्तव में "async" मॉड्यूल की आवश्यकता नहीं है, लेकिन मैं बस "आदत में" हूं जैसा कि यह था। यह "ब्लॉक" नहीं करता है इसलिए मैं इसे बेहतर मानता हूं।

तो जैसा कि आप देख सकते हैं, आप आरंभिक .populate() कॉल कुछ भी नहीं करता है क्योंकि यह एक _id . से "कुंजी" बंद करने की अपेक्षा करता है एक सरणी इनपुट से विदेशी संग्रह में मूल्य जो यह "कड़ाई से बोल रहा है" ऐसा नहीं है क्योंकि "कुंजी" "विदेशी कुंजी" वाले "छात्र" पर है।

मैंने वास्तव में इसे एक यहां हाल के उत्तर में कवर किया था। , शायद आपकी स्थिति के लिए बिल्कुल विशिष्ट नहीं है। ऐसा लगता है कि आपकी खोज से सही "समान उत्तर" नहीं मिला (हालांकि बिल्कुल नहीं) जिससे आप संदर्भ प्राप्त कर सकें।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB डेटाबेस एन्क्रिप्शन

  2. नोड + मोंगोडब + नेस्टेड सरणी को सॉर्ट करें

  3. रूबी ऑन रेल्स में आप मोंगोइड के लिए रिश्तों को कैसे बीजते हैं?

  4. MongoDB के प्रदर्शन का अनुकूलन कैसे करें

  5. मैं कैसे एक एकत्रीकरण का उपयोग कर mongodb से दो तिथियों के बीच डेटा वापस फ़िल्टर कर सकता हूं:मैच, लुकअप और प्रोजेक्ट?