mongoose
Mongoose bevolking
Zoeken…
Syntaxis
- Model.Query.populate (pad, [selecteren], [model], [wedstrijd], [opties]);
parameters
| Param | Details |
|---|---|
| pad | String - De veldsleutel die moet worden ingevuld |
| kiezen | Object, String - Veldselectie voor de populatiequery. |
| model- | Model - exemplaar van het model waarnaar wordt verwezen |
| bij elkaar passen | Object - Voorwaarden invullen |
| opties | Object - Zoekopdrachtopties |
Eenvoudig invullen
Mongoespopulatie wordt gebruikt om gegevens weer te geven voor documenten waarnaar wordt verwezen uit andere collecties.
Laten we zeggen dat we een Person waarnaar wordt verwezen documenten genaamd Address .
Persoon Model
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Adresmodel
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
Bevolken Address binnen Person te gebruiken's ObjectId, met behulp van laten we zeggen findOne() , gebruikt u de populate() functie en voeg het veld sleutel address als de eerste parameter.
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
});
Of
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
De bovenstaande vraag moet het onderstaande document opleveren.
Persoon Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Adres Doc
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Bevolkte Doc
{
"_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"
}
}
Verwaarloos een paar velden
Stel dat u de velden houseNum en street niet wilt in het address van het uiteindelijke bevolkte document, gebruik de populate() als volgt,
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
});
Of
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
Dit levert het volgende definitieve bevolkte document op,
Bevolkte Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Vul slechts enkele velden in
Als u alleen de velden houseNum en street in het address in het uiteindelijke houseNum document wilt, gebruikt u de functie houseNum populate() als volgt in de bovenstaande twee methoden,
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Of
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Dit levert het volgende definitieve bevolkte document op,
Bevolkte Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Geneste bevolking
Laten we zeggen dat je een user , dat name , contactNo , address en friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Als u een gebruiker, zijn vrienden en vrienden van vrienden wilt vinden , moet u de populatie op 2 niveaus doen, namelijk de geneste populatie .
Vrienden en vrienden van vrienden vinden:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Alle parameters en options van populate kunnen ook worden gebruikt in geneste populaties om het gewenste resultaat te krijgen.
Op dezelfde manier kunt u meer levels populate volgens uw vereiste.
Het wordt niet aanbevolen om geneste populatie te doen voor meer dan 3 niveaus. Als u geneste populaties voor meer dan 3 niveaus moet uitvoeren, moet u mogelijk uw schema herstructureren.