2012-10-07 16 views
13

Tôi đang sử dụng mongoose.js trên một máy chủ kết nối với Node.js MongoDB và Tôi có một mô hình mongoose như sauKhông thể có được Mongoose.js Subdocument mảng để cư

SubSchema = new Schema({ 
    _member:  {type: ObjectId, ref: 'Member'}, 
    members:  [{type: ObjectId, ref: 'Member'}], 
    created:  { type: Date, default: Date.now } 
}); 
mongoose.model('SubModel', SubSchema); 

MainSchema = new Schema({ 
    _member:  {type: ObjectId, ref: 'Member'}, 
    subs:  [SubSchema], 
    members:  [{type: ObjectId, ref: 'Member'}], 
    created:  { type: Date, default: Date.now } 
}); 
var MainModel mongoose.model('MainModel', MainSchema); 

mà tôi kéo với một lệnh như thế này

var q = MainModel.find({}) 
       .sort('created', -1) 
       .limit(25) 
       .populate("_member") 
       .populate("subs._member") 
       .populate("subs.members"); 

q.execFind(function(err, mains){ 
    //mains[0].subs[0].members - will always be empty why? 
}); 

vấn đề của tôi là tôi không thể nhận được mảng phụ để điền hoặc thậm chí tải, nó chỉ hiển thị dưới dạng một mảng trống.

Tôi đã thử .populate ("subs.members") không có kết quả mặc dù tải subs._member tốt

+1

Tôi đang tìm giải pháp cho vấn đề này, các nhánh phụ của tôi có hai cấp sâu sẽ không phổ biến. Bạn đã bao giờ tìm thấy một? –

+3

Đây là tính năng được yêu cầu rộng rãi được mong đợi sớm. https://github.com/LearnBoost/mongoose/issues/601 – JohnnyHK

Trả lời

9

hãy thử điều này

SubSchema = new Schema({ 
     _member:  {type: ObjectId, ref: 'Member'}, 
     members:  [{type: ObjectId, ref: 'Member'}], 
     created:  { type: Date, default: Date.now } 
    }); 
    var SubModel = mongoose.model('SubModel', SubSchema);//add 

    MainSchema = new Schema({ 
     _member:  {type: ObjectId, ref: 'Member'}, 
     subs:  [SubSchema], 
     members:  [{type: ObjectId, ref: 'Member'}], 
     created:  { type: Date, default: Date.now } 
    }); 

    var MainModel = mongoose.model('MainModel', MainSchema); 

    MainModel.find({}) 
      .sort('created', -1) 
      .limit(25) 
      .populate("_member") 
      .populate("subs._member") 
      .exec(function(err, mains){ 

       //add 
       SubModel.populate(mains,{ 
        path:'subs.members' 
       },function(err,mains){ 
        //mains[0].subs[0].members - is not empty 
       }); 
      }); 
+0

hoạt động, câu trả lời hoàn chỉnh nhất .. và nó đã sửa lỗi và cách giải quyết từ nhóm mongoose để đến thời điểm này, mặc dù vấn đề ban đầu chưa bao giờ được khắc phục ..ai đó đã đưa ra một giải pháp để làm cho nó hoạt động tốt ... https://gist.github.com/joeytwiddle/6129676 – chrishawn

0

tôi có cái gì đó trông hơi khác nhau nhưng populates tài liệu với các mục mảng. Tôi tự hỏi nếu đó là của objectid đang gây ra các vấn đề.

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema, ObjectID = Schema.ObjectId; 

var SubSchema = new Schema({ 
    testsub: String,  
    created: { type: Date, default: Date.now } 
}); 

var MainSchema = new Schema({ 
    test: String 
    subs: [SubSchema], 
    created: { type: Date, default: Date.now } 
}); 

mongoose.model('MainSchema', MainSchema, mainschema); 

var query = MainSchema.find({}); 
+0

đây là trên một đọc/lấy không tiết kiệm – chrishawn

+0

Tôi đã thay đổi ví dụ của tôi. Hy vọng nó sẽ giúp bạn hiểu. –

+1

yeah exmaples này vẫn còn một mức độ ít phức tạp .. mảng của tôi trên mainschema luôn populates tốt .. mảng trên mảng subschema là một trong đó không bao giờ populates ... tôi không nghĩ rằng đó là objectid vì ref refid trên subitem không trong một mảng popuates tốt – chrishawn

7

@leesei: Tôi không thể bình luận về bài đăng của bạn (quá ít đại diện), vì vậy tôi để điều này như một câu trả lời riêng biệt.

Trong mongoose 3.6 dân số nhỏ vẫn không hoạt động, vấn đề github.com/LearnBoost/mongoose/issues/1381 đã bị đóng 7 tháng trước với giải pháp sau đây là giải pháp thay thế. Tôi đã phải thay đổi nó một chút để hợp nhất các subdocument dân cư trở lại tài liệu chính.

mô hình của subdocument Story phải được xác định một cách rõ ràng:

Person.findById(user1._id).populate("stories") 
    .exec(function(err, doc { 
     Story.populate(doc.stories, {path: 'creator'}, function (err, stories) { 
      doc.stories = stories; 
      return doc; 
     }) 
}) 

Trong giải pháp trên công trình này:

Story.populate(doc.stories, {path: 'creator'}, callback) 

nhưng điều này vẫn sẽ không làm việc:

Story.populate(doc, {path: 'stories.creator'}, callback) 
0

Tôi có nhiều lớp tổ sâu trong các tài liệu phụ và không có tùy chọn nào được cung cấp cho tôi. Tôi tìm thấy plugin Mongoose tuyệt vời này sẽ làm dân số sâu liền mạch. Bạn chỉ cần sử dụng cú pháp giống như bạn mong đợi để làm việc với populate, nhưng nó thực sự hoạt động.

Các vấn đề liên quan