work multiple fields doesn array node.js mongodb mongoose mongoose-populate

node.js - multiple - populate fields mongoose



Mangosta poblar matriz anidada (3)

Asumiendo los siguientes 3 modelos:

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

Cuando consulto para Cars puedo llenar las partes:

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

¿Hay alguna forma de mangosta para poblar los otros ídolos en los objetos de partes anidadas para todos los automóviles?

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

Probablemente pueda iterar sobre cada auto e intentar llenarlo:

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

El problema es que tengo que usar una lib como asincronización para hacer la llamada de relleno para cada uno y esperar hasta que todos hayan terminado y luego regresar.

Posible hacer sin bucle sobre todos los coches?


Mangosta 4 apoya esto

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



Actualización: Consulte la respuesta de Trinh Hoang Nhu para una versión más compacta que se agregó en Mongoose 4. Resumido a continuación:

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

Mangosta 3 y abajo:

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

Para poblaciones anidadas como esta, debe indicar a mangosta el esquema del que desea rellenar.