MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mongoose - mengakses objek bersarang dengan .populate

Ini adalah versi sederhana dari apa yang Anda inginkan.

Data dasar yang harus disiapkan, pertama "siswa":

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

Dan kemudian koleksi "tim":

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

Begini caranya:

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 ) );
    });

  });

Dan itu memberi Anda hasil:

{
    "_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
            }
        }
    ]
}

Anda benar-benar tidak memerlukan modul "async", tetapi saya hanya "dalam kebiasaan" seperti itu. Itu tidak "memblokir" jadi saya menganggapnya lebih baik.

Jadi seperti yang Anda lihat, inisial .populate() panggilan tidak melakukan apa pun seperti yang diharapkan untuk "mengunci" dari _id nilai dalam koleksi asing dari input array yang "tepatnya" ini tidak demikian karena "kunci" ada di "siswa" yang berisi "kunci asing".

Saya benar-benar membahas ini dalam jawaban terbaru di sini , mungkin tidak terlalu spesifik untuk situasi Anda. Tampaknya penelusuran Anda tidak menemukan "jawaban yang sama" yang benar (meskipun tidak persis ) untuk Anda jadikan referensi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mengembalikan hanya nilai bidang di mongodb

  2. Bagaimana cara membuat Dokumen Bson dengan nilai Null menggunakan driver resmi C #?

  3. Spring MongoDB Repository hanya berfungsi dalam beberapa kasus

  4. Haruskah kita menggunakan dbref atau dokumen yang disematkan dalam aplikasi yang banyak membaca

  5. Cara menentukan preferensi baca dalam kueri mongo Meteor