2015-01-27 24 views
15

Giả sử 3 mô hình sau:Mongoose cư lồng mảng

var CarSchema = new Schema({ 
    name: {type: String}, 
    partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}], 
}); 

var PartSchema = new Schema({ 
    name: {type: String}, 
    otherIds: [{type: Schema.Types.ObjectId, ref: 'Other'}], 
}); 

var OtherSchema = new Schema({ 
    name: {type: String} 
}); 

Khi tôi truy vấn cho Ô tô tôi có thể cư trú trong các phần:

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 
}); 

Có cách nào trong mongoose để cư otherIds trong các bộ phận lồng nhau đối tượng cho tất cả các xe ô tô.

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 
    // Try an populate nested 
    Part.populate(cars, {path: 'partIds.otherIds'}, function(err, cars) { 
    // This does not populate all the otherIds within each part for each car 
    }); 
}); 

tôi có lẽ có thể lặp qua mỗi xe và cố gắng cư:

Car.find().populate('partIds').exec(function(err, cars) { 
    // list of cars with partIds populated 

    // Iterate all cars 
    cars.forEach(function(car) { 
    Part.populate(car, {path: 'partIds.otherIds'}, function(err, cars) { 
     // This does not populate all the otherIds within each part for each car 
    }); 
    }); 
}); 

Vấn đề có là tôi phải sử dụng một lib như async để thực hiện cuộc gọi điền để mỗi và chờ đợi cho đến khi tất cả đều xong rồi quay lại.

Có thể thực hiện mà không bị lặp trên tất cả các xe ô tô?

+0

phương pháp populate này này diễn ra bên trong get/post tuyến đường của bạn có đúng không? – Winnemucca

Trả lời

29

Cập nhật: Xin xem Trinh Hoang Nhu's answer cho một phiên bản nhỏ gọn hơn mà đã được bổ sung trong Mongoose 4. Tóm tắt dưới đây:

Car 
    .find() 
    .populate({ 
    path: 'partIds', 
    model: 'Part', 
    populate: { 
     path: 'otherIds', 
     model: 'Other' 
    } 
    }) 

Mongoose 3 và dưới đây:

Car 
    .find() 
    .populate('partIds') 
    .exec(function(err, docs) { 
    if(err) return callback(err); 
    Car.populate(docs, { 
     path: 'partIds.otherIds', 
     model: 'Other' 
    }, 
    function(err, cars) { 
     if(err) return callback(err); 
     console.log(cars); // This object should now be populated accordingly. 
    }); 
    }); 

Đối với các quần thể lồng nhau như thế này, bạn phải nói với mongoose Schema bạn muốn popu muộn từ.

+0

Crap RTFM;) Tôi thấy điều đó ngay bây giờ. Tuy nhiên không có vấn đề gì tôi cố gắng tôi lấy lại một mảng trống cho otherIds. Như một kiểm tra sanity Nếu tôi không gọi phương thức cư trú có một mảng của id (đó là chính xác). Dân cư không điền các id đó. Chạy phiên bản 3.8.22 mới nhất từ ​​npm – lostintranslation

+0

Cũng đã bật tính năng ghi nhật ký. Tôi không thấy một cuộc gọi nào khác đến bộ sưu tập khác để điền 'tham gia'. Vì vậy, mongoose thậm chí không thực hiện cuộc gọi. – lostintranslation

+2

@lostintranslation Nó phải là 'model: 'Other'' trong cuộc gọi' populate' lồng nhau. – JohnnyHK

21

Mongoose 4 hỗ trợ

Car 
.find() 
.populate({ 
    path: 'partIds', 
    model: 'Part', 
    populate: { 
    path: 'otherIds', 
    model: 'Other' 
    } 
}) 
+2

Lưu ý: mô hình: 'Khác' là cần thiết. Không có nó, nó cho mảng trống. Tài liệu không chỉ định: http://mongoosejs.com/docs/populate.html#deep-populate –

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