Suche…


Syntax

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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow