mongoose - normalmente - Ruta de poblado de mangosta con múltiples subtratas
mangosta vs leon (1)
@
.populate
path: "_bId"
model: "B"
populate: [
{
path: "_cId"
model: "C"
populate:
path: "_eId"
model: "E"
}
{
path: "_dId"
}
]
, (error) =>
Esta solución funciona totalmente bien y me acabo de enterar de esto.
Imagina que tengo los siguientes modelos:
# MODEL A
schemaA = mongoose.Schema
_bId:
type: mongoose.Schema.Types.ObjectId
ref: "B"
# MODEL B
schemaB = mongoose.Schema
_cId:
type: mongoose.Schema.Types.ObjectId
ref: "C"
_dId:
type: mongoose.Schema.Types.ObjectId
ref: "D"
# MODEL C
schemaC = mongoose.Schema
_eId:
type: mongoose.Schema.Types.ObjectId
ref: "E"
Los modelos D y E no tienen ninguna otra referencia a objeto y, por razones de conveniencia, por lo tanto, ya no se enumeran.
¿Cuál es la mejor práctica para poblar el modelo "A" con todas las referencias? Actualmente resuelvo esta tarea de la siguiente manera (es un método de instancia porque lo necesito con bastante frecuencia):
schemaA.methods =
populateAll: (cb) ->
@
.populate
path: "_bId"
model: "B"
populate:
path: "_cId"
model: "C"
populate:
path: "_eId"
model: "E"
, (error) =>
return cb error, @ if error?
D.findById @._bId._dId
.exec (error, d) =>
return cb error, @ if error?
@._bId._dId = d
return cb error, @
Esta es la única forma que encontré para rellenar todas las referencias porque es bastante difícil poblar varias rutas con múltiples rutas en diferentes modelos. Ya probé una solución como la siguiente, pero como se puede imaginar, solo sobrescribiría las poblaciones anteriores:
@
.populate
path: "_bId"
model: "B"
populate:
path: "_cId"
model: "C"
populate:
path: "_eId"
model: "E"
.populate
path: "_bId"
model: "B"
populate:
path: "_dId"
model: "D"