mongoose
Mungo-Bevölkerung
Suche…
Syntax
- Model.Query.populate (Pfad, [Auswahl], [Modell], [Übereinstimmung], [Optionen]);
Parameter
| Param | Einzelheiten |
|---|---|
| Pfad | String - Der Feldschlüssel, der gefüllt werden soll |
| wählen | Object, String - Feldauswahl für die Populationsabfrage. |
| Modell- | Modell - Instanz des referenzierten Modells |
| Spiel | Objekt - Befüllen Sie die Bedingungen |
| Optionen | Objekt - Abfrageoptionen |
Einfach bevölkern
Mongoose Populate wird verwendet, um Daten für referenzierte Dokumente aus anderen Sammlungen anzuzeigen.
Nehmen wir an, wir haben ein Person , auf das Dokumente mit dem Namen Address referenziert wurden.
Personenmodell
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Adressmodell
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
So füllen Address innerhalb Person unter Verwendung ihrer ObjectId, die mit sagen wir mal findOne() , verwenden Sie die populate() Funktion und fügen Sie das Feld address als ersten 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
});
Oder
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
Die Abfrage oben sollte das Dokument unten erstellen.
Person Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Adresse Doc
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Belegter 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"
}
}
Vernachlässigen Sie ein paar Felder
Lassen Sie uns sagen , dass Sie nicht die Felder wollen houseNum und street im address des letzten besiedelten doc, verwenden Sie das populate() wie folgt,
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
});
Oder
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
Dadurch wird das folgende endgültige aufgefüllte Dokument erstellt:
Belegter Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Füllen Sie nur wenige Felder aus
Wenn Sie nur die Felder houseNum und street im address des endgültig houseNum möchten , verwenden Sie die Funktion populate() in den beiden obigen Methoden wie
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Oder
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Dadurch wird das folgende endgültige aufgefüllte Dokument erstellt:
Belegter Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Verschachtelte Bevölkerung
Angenommen, Sie haben ein user , das den name , die contactNo , die address und die friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Wenn Sie einen Benutzer, seine Freunde und Freunde von Freunden suchen möchten, müssen Sie die Bevölkerung auf 2 Ebenen, dh die verschachtelte Bevölkerung, ausführen .
Freunde und Freunde von Freunden finden:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Alle parameters und options des populate können auch innerhalb des verschachtelten Populate verwendet werden, um das gewünschte Ergebnis zu erhalten.
Ebenso können Sie populate mehr levels entsprechend Ihrer Anforderung.
Es wird nicht empfohlen, eine verschachtelte Population für mehr als 3 Stufen zu erstellen. Wenn Sie für mehr als 3 Ebenen verschachteltes Auffüllen durchführen müssen, müssen Sie möglicherweise Ihr Schema umstrukturieren.