mongoose
Población de mangosta
Buscar..
Sintaxis
- Model.Query.populate (ruta, [seleccionar], [modelo], [coincidir], [opciones]);
Parámetros
| Param | Detalles |
|---|---|
| camino | Cadena : la clave de campo que se va a rellenar |
| seleccionar | Objeto, Cadena - Selección de campo para la consulta de población. |
| modelo | Modelo - Instancia del modelo de referencia |
| partido | Objeto - Condiciones de poblado |
| opciones | Objeto - Opciones de consulta |
Poblado simple
Mongoose populate se usa para mostrar datos de documentos de referencia de otras colecciones.
Digamos que tenemos un modelo de Person que tiene documentos de referencia llamados Address .
Modelo de persona
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Modelo de dirección
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
Para rellenar la Address dentro de la Person usa su ObjectId, usando digamos findOne() , use la función populate() y agregue la address clave del campo como primer parámetro.
Person.findOne({_id: req.params.id})
.populate('address') // <- use the populate() function
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
O
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
La consulta anterior debe producir el documento a continuación.
Persona doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Dirección doc
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Doc poblado
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Descuidar algunos campos
Supongamos que no desea que los campos houseNum y street en el campo de address del documento final finalizado, utilice el houseNum populate() siguiente manera:
Person.findOne({_id: req.params.id})
.populate('address', '-houseNum -street') // note the `-` symbol
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
O
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', '-houseNum -street'); // note the `-` symbol
Esto producirá el siguiente documento final completado,
Doc poblado
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Rellenar solo unos pocos campos
Si solo desea que los campos houseNum y street en el campo de address en el documento final completado, use la función populate() siguiente manera en los dos métodos anteriores,
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
O
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Esto producirá el siguiente documento final completado,
Doc poblado
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Población anidada
Digamos que tiene un esquema de user , que contiene name , contactNo , address y friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Si desea encontrar un usuario, sus amigos y amigos de amigos , necesita hacer población en 2 niveles, es decir, Población anidada .
Para encontrar amigos y amigos de amigos:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Todos los parameters y options de populate se pueden usar también dentro del poblado anidado, para obtener el resultado deseado.
Del mismo modo, puede populate más levels acuerdo a sus requerimientos.
No se recomienda hacer población anidada por más de 3 niveles. En caso de que necesite hacer un relleno anidado para más de 3 niveles, es posible que deba reestructurar su esquema.