mongoose
Mongoose Befolkning
Sök…
Syntax
- Model.Query.population (sökväg, [välj], [modell], [matcha], [alternativ]);
parametrar
| Param | detaljer |
|---|---|
| väg | String - Fältnyckeln som ska fyllas i |
| Välj | Objekt, sträng - fältval för befolkningsfrågan. |
| modell | Modell - förekomst av den refererade modellen |
| match | Objekt - Befolkningsförhållanden |
| alternativ | Objekt - Frågeställningar |
Enkel befolkning
Mongoosbefolkning används för att visa data för referensdokument från andra samlingar.
Låt oss säga att vi har en Person som har refererat till dokument som heter Address .
Personmodell
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
});
Att fylla Address inne Person använder sin ObjectId hjälp låt oss säga findOne() använder populate() funktion och lägga till fältet nyckeln address som första 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
});
Eller
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
Frågan ovan bör producera dokumentet nedan.
Person Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Adress Dok
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Befolkad dok
{
"_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"
}
}
Försumma några fält
Låt oss säga att du inte vill ha fälten houseNum och street i address för det slutliga befolkade dokumentet, använd populate() enligt följande,
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
});
Eller
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
Detta kommer att producera följande slutbefolkade dokument,
Befolkad dok
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Uppge bara ett fåtal fält
Om du bara vill att fälten houseNum och street i address i det slutliga befolkade dokumentet ska du använda funktionen populate() enligt följande i ovanstående två metoder,
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Eller
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Detta kommer att producera följande slutbefolkade dokument,
Befolkad dok
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Häckt befolkning
Låt oss säga att du har ett user som innehåller name , contactNo , address och friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Om du vill hitta en användare, hans vänner och vänner till vänner , måste du göra en befolkning på två nivåer, dvs. kapslade befolkningen .
Så här hittar du vänner och vänner till vänner:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Alla parameters och options för populate kan också användas i kapslade befolkning för att få önskat resultat.
På samma sätt kan du populate fler levels enligt ditt krav.
Det rekommenderas inte att göra kapslad population i mer än 3 nivåer. Om du behöver göra kapslad befolkning i mer än tre nivåer, kan du behöva omstrukturera ditt schema.