mongoose
モンゴース人口
サーチ…
構文
- 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"
}
}
いくつかのフィールドを無視する
あなたがフィールドしたくないとしましょうhouseNumやstreetでの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フィールドにフィールドhouseNumとstreet だけが必要な場合は、上記の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"
}
}
入れ子の人口
name 、 contactNo address contactNo 、 address 、 friendsを含む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すべてのparametersとoptionsは、目的の結果を得るためにネストされたpopulate内でも使用できます。
同様に、あなたができるpopulateよりlevelsあなたの条件に応じて。
ネストした母集団を3つ以上のレベルで行うことはお勧めしません。ネストされたデータを3つ以上のレベルで処理する必要がある場合は、スキーマを再構築する必要があります。