mongoose
Монгузское население
Поиск…
Синтаксис
- Model.Query.populate (путь, [select], [model], [match], [options]);
параметры
| Param | подробности |
|---|---|
| дорожка | String - поле для заполнения |
| Выбрать | Object, String - выбор поля для запроса населения. |
| модель | Модель - экземпляр ссылочной модели |
| матч | Объект - заполнять условия |
| опции | Объект - параметры запроса |
Простое заполнение
Мангузная населенность используется для отображения данных для ссылочных документов из других коллекций.
Допустим, у нас есть модель Person , которая ссылается на документы, называемые Address .
Модель персонажа
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Адресная модель
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
Для заполнения Address внутри Person , используя его ObjectId, используя , скажем , findOne() , используйте populate() функцию и добавить ключевое поле address в качестве первого параметра.
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
});
Или же
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
В приведенном выше запросе должен быть указан документ ниже.
Person Doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Адрес Doc
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Населенный Док
{
"_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"
}
}
Отбросить несколько полей
Предположим, вы не хотите, чтобы поля houseNum и street в поле address конечного заполненного документа использовали houseNum populate() следующим образом:
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
});
Или же
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
Это приведет к получению следующего последнего заполненного документа,
Населенный Док
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Залить только несколько полей
Если вы хотите, чтобы поля houseNum и street в поле address в конечном заполненном документе, используйте функцию houseNum populate() как houseNum выше в двух вышеуказанных методах,
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Или же
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Это приведет к получению следующего последнего заполненного документа,
Населенный Док
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Вложенное население
Допустим, у вас есть user схема, которая содержит name , contactNo , address и friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Если вы хотите найти пользователя, друзей и друзей друзей , вам нужно сделать население на 2 уровнях, т.е. вложенное население .
Чтобы найти друзей и друзей друзей:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Все parameters и options populate могут использоваться внутри вложенного заполнения, чтобы получить желаемый результат.
Аналогично, вы можете populate больше levels соответствии с вашими требованиями.
Не рекомендуется делать вложенное население более чем на 3 уровня. Если вам нужно сделать вложенное заполнение более чем на 3 уровня, вам может потребоваться реструктурировать вашу схему.