mongoose
Populacja mangusty
Szukaj…
Składnia
- Model.Query.populate (ścieżka, [wybierz], [model], [dopasuj], [opcje]);
Parametry
| Param | Detale |
|---|---|
| ścieżka | String - Klucz pola do wypełnienia |
| Wybierz | Object, String - Wybór pola dla zapytania dotyczącego populacji. |
| Model | Model - Instancja modelu, do którego istnieje odniesienie |
| mecz | Obiekt - wypełnij warunki |
| opcje | Obiekt - opcje zapytania |
Proste wypełnianie
Wypełnienie Mongoose służy do wyświetlania danych dla dokumentów, do których istnieją odniesienia z innych kolekcji.
Powiedzmy, że mamy model Person , który odwoływał się do dokumentów o nazwie Address .
Model osoby
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Model adresu
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
Aby wypełnić Address wewnątrz Person za pomocą ObjectId, używając powiedzmy findOne() , użyj funkcji populate() i dodaj address klucza pola jako pierwszy parametr.
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
});
Lub
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
Powyższe zapytanie powinno wygenerować poniższy dokument.
Osoba Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Dokument adresowy
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Zaludniony 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"
}
}
Zlekceważ kilka pól
Powiedzmy, że nie chcesz pól houseNum i street w polu address ostatniego zapełnionego dokumentu, użyj funkcji populate() w następujący sposób,
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
});
Lub
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
Spowoduje to wygenerowanie następującego końcowego zaludnionego dokumentu,
Zaludniony Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Wypełnij tylko kilka pól
Jeśli chcesz tylko pola houseNum i street w polu address w ostatnim zapełnionym dokumencie, użyj funkcji populate() w następujący sposób w dwóch powyższych metodach:
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Lub
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Spowoduje to wygenerowanie następującego końcowego zaludnionego dokumentu,
Zaludniony Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Zagnieżdżona populacja
contactNo , że masz schemat user , który zawiera name i name , contactNo , address i friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Jeśli chcesz znaleźć użytkownika, jego przyjaciół i przyjaciół znajomych , musisz wykonać populację na 2 poziomach, tj. Zagnieżdżoną populację .
Aby znaleźć przyjaciół i przyjaciół znajomych:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Wszystkie parameters i options populate mogą być również użyte w zagnieżdżonym wypełnieniu, aby uzyskać pożądany wynik.
Podobnie można populate kolejne levels zgodnie z własnymi wymaganiami.
Nie zaleca się wykonywania zagnieżdżonej populacji na więcej niż 3 poziomach. W przypadku potrzeby zagnieżdżenia wypełnienia dla więcej niż 3 poziomów może być konieczna restrukturyzacja schematu.