Ricerca…


Sintassi

  1. Model.Query.populate (path, [select], [model], [match], [options]);

Parametri

Param Dettagli
sentiero String - Il campo chiave da compilare
selezionare Oggetto, stringa : selezione del campo per la query della popolazione.
modello Modello - Istanza del modello di riferimento
incontro Oggetto : condizioni generali
opzioni Oggetto - Opzioni di query

Popolazione semplice

Il popolamento di Mongoose viene utilizzato per mostrare i dati dei documenti di riferimento da altre raccolte.

Diciamo che abbiamo un modello Person che ha referenziato documenti chiamati Address .

Modello di persona

var Person = mongoose.model('Person', {
    fname: String,
    mname: String,
    lname: String,
    address: {type: Schema.Types.ObjectId, ref: 'Address'}
});

Modello di indirizzo

var Address = mongoose.model('Address', {
    houseNum: String,
    street: String,
    city: String,
    state: String,
    country: String
});

Per popolare l' Address all'interno della Person usando il suo ObjectId, usando diciamo findOne() , usa la funzione populate() e aggiungi l' address chiave del campo come primo parametro.

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 query sopra dovrebbe produrre il documento qui sotto.

Persona Doc

{
    "_id":"123abc",
    "fname":"John",
    "mname":"Kennedy",
    "lname":"Doe",
    "address":"456def" // <- Address' Id
}

Indirizzo doc

{
    "_id":"456def",
    "houseNum":"2",
    "street":"Street 2",
    "city":"City of the dead",
    "state":"AB",
    "country:"PH"
}

Documento popolato

 {
    "_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"
    }
}

Trascura alcuni campi

Diciamo che non vuoi i campi houseNum e street nel campo address del documento popolato finale, usa il populate() come segue,

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

Questo produrrà il seguente documento finale popolato,

Documento popolato

 {
    "_id":"123abc",
    "fname":"John",
    "mname":"Kennedy",
    "lname":"Doe",
    "address":{
        "_id":"456def",
        "city":"City of the dead",
        "state":"AB",
        "country:"PH"
    }
}

Compila solo alcuni campi

Se si desidera solo i campi houseNum e street nel campo address nel documento finale populato, utilizzare la funzione populate() come segue nei due metodi precedenti,

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

Questo produrrà il seguente documento finale popolato,

Documento popolato

 {
    "_id":"123abc",
    "fname":"John",
    "mname":"Kennedy",
    "lname":"Doe",
    "address":{
        "_id":"456def",
        "houseNum":"2",
        "street":"Street 2"
    }
}

Popolazione annidata

Diciamo che hai uno schema user , che contiene name , contactNo , address e friends .

var UserSchema = new mongoose.Schema({
    name : String,
    contactNo : Number,
    address : String,
    friends :[{
        type: mongoose.Schema.Types.ObjectId,
        ref : User
    }]
});

Se vuoi trovare un utente, i suoi amici e amici di amici , devi fare la popolazione su 2 livelli, cioè la popolazione annidata .

Per trovare amici e amici di amici:

User.find({_id : userID})
    .populate({ 
        path : 'friends',
        populate : { path : 'friends'}//to find friends of friends
    });

Tutti i parameters e le options di populate possono essere utilizzati anche all'interno del popolato nidificato, per ottenere il risultato desiderato.

Allo stesso modo, puoi populate più levels base alle tue esigenze.

Non è raccomandato fare popolazione annidata per più di 3 livelli. Nel caso in cui sia necessario eseguire il popolamento nidificato per più di 3 livelli, potrebbe essere necessario ristrutturare lo schema.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow