サーチ…


構文

  1. Model.Query.populate(パス、[選択]、[モデル]、[一致]、[オプション]);

パラメーター

Param 詳細
パス String - 読み込まれるフィールドキー
選択する Object、String - 母集団クエリーのフィールド選択。
モデル モデル - 参照モデルのインスタンス
一致 オブジェクト - 条件を設定する
オプション オブジェクト - クエリオプション

シンプルポピュレート

Mongoose populateは、他のコレクションから参照される文書のデータを表示するために使用されます。

Addressというドキュメントを参照しているPersonモデルがあるとします。

人物モデル

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
});

findOne()を使用してObjectIdを使用してPerson内のAddressにデータを設定するには、 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
}

住所録

{
    "_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"
    }
}

いくつかのフィールドを無視する

あなたがフィールドしたくないとしましょうhouseNumstreetでのaddressの最終人口ドキュメントのフィールドを使用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"
    }
}

少数のフィールドだけを設定する

最終的に作成されたドキュメントのaddressフィールドにフィールドhouseNumstreet だけが必要な場合は、上記の2つのメソッドでpopulate()関数を次のように使用します。

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"
    }
}

入れ子の人口

namecontactNo address contactNoaddressfriendsを含むuserスキーマがあるとし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
    });

populateすべてのparametersoptionsは、目的の結果を得るためにネストされたpopulate内でも使用できます。

同様に、あなたができるpopulateよりlevelsあなたの条件に応じて。

ネストした母集団を3つ以上のレベルで行うことはお勧めしません。ネストされたデータを3つ以上のレベルで処理する必要がある場合は、スキーマを再構築する必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow