mongoose
Popolazione di Mongoose
Ricerca…
Sintassi
- 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.