Buscar..


Sintaxis

  1. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow