Szukaj…


Składnia

  1. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow