MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongoose - truy cập đối tượng lồng nhau với .populate

Đây là phiên bản đơn giản của những gì bạn muốn.

Dữ liệu cơ bản để thiết lập, trước tiên là "sinh viên":

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

Và sau đó là bộ sưu tập "nhóm":

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

Đây là cách bạn làm điều đó:

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

  });

Và nó cho bạn kết quả:

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

Bạn thực sự không cần mô-đun "async", nhưng tôi chỉ "theo thói quen" như nó đã có. Nó không "chặn" nên tôi xem nó tốt hơn.

Như bạn có thể thấy, bạn viết tắt .populate() cuộc gọi không thực hiện bất cứ điều gì vì nó mong đợi "khóa" một _id giá trị trong tập hợp ngoại lai từ một đầu vào mảng mà điều này "nói đúng ra" không phải như vậy vì "khóa" nằm trên "sinh viên" có chứa "khóa ngoại".

Tôi thực sự đã trình bày vấn đề này trong câu trả lời gần đây tại đây , có thể không chính xác cụ thể cho tình huống của bạn. Có vẻ như tìm kiếm của bạn đã không đưa ra "câu trả lời tương tự" chính xác (mặc dù không chính xác) để bạn lấy tham khảo từ đó.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để gửi đối tượng từ MongoDB sang ngọc?

  2. thả toàn bộ cơ sở dữ liệu trong một lệnh duy nhất để khôi phục kết xuất mongodb

  3. Làm cách nào để truy cập các đối tượng json được nhúng trong Pandas DataFrame?

  4. làm thế nào để sử dụng MongoDB để lưu trữ tin nhắn ejabberd?

  5. MongoDB sort ()