Поиск…


Синтаксис

  1. 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 уровня, вам может потребоваться реструктурировать вашу схему.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow