Sök…


Syntax

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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow