populate
の例に関連する情報を提供するチュートリアルはたくさんありますが、その意味を正確に説明するチュートリアルはありませんが、理解できない次のコード行に遭遇しました。ここに例があります
var mongoose = require('mongoose'), Schema = mongoose.Schema
var PersonSchema = new Schema({
name : String,
age : Number,
stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});
var StorySchema = new Schema({
_creator : {
type: Schema.ObjectId,
ref: 'Person'
},
title : String,
fans : [{ type: Schema.ObjectId, ref: 'Person' }]
});
var Story = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
Story.findOne({ title: /Nintendo/i }).populate('_creator') .exec(function (err, story) {
if (err) ..
console.log('The creator is %s', story._creator.name);
// prints "The creator is Aaron"
})
populate()
function is mongooseは、参照内のデータを入力するために使用されます。あなたの例では、StorySchema
には__creator
_フィールドがあり、これは基本的にmongodbドキュメントのObjectId
byである__id
_フィールドを参照します。
populate()関数は、文字列またはオブジェクトを入力として受け入れることができます。
Stringは、入力する必要があるフィールド名です。あなたの場合、それは__creator
_です。マングースがmongodbから1つのドキュメントを見つけた後、その結果は以下のようになります
__creator: {
name: "SomeName",
age: SomeNumber,
stories: [Set Of ObjectIDs of documents in stories collection in mongodb]
},
title: "SomeTitle",
fans: [Set of ObjectIDs of documents in persons collection in mongodb]
_
populateは、オブジェクトを入力として受け入れることもできます。
Mongooseのpopulate()
関数のドキュメントは以下にあります。 http://mongoosejs.com/docs/2.7.x/docs/populate.html
私はランダムにその質問に出くわしましたが、それが古い方法であったとしても、それが説明されている方法に納得していないので、私はここで助ける必要があると感じています:
Populate()関数に値を入力...
それはネイティブの英語を話す人にとっては非常に明確かもしれませんが、他の人にとってはそうではないかもしれません。
Populateは、ドキュメント内の指定されたパスを他のコレクションのドキュメントで自動的に置き換えます
あなたの例を見てみましょう
Story.findOne({ title: Nintendo })
そのようなストーリーを返します:
{
_creator : A0jfdSMmEJj*9, //id of the creator (totaly random, just for a clear example)
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88] // again, totaly random that i've typed here
}
}
場合によっては、作成者やファンを気にしないので、このような要求で十分な場合があります。そのため、IDがあってもそれほど問題にはなりません。
しかし、その作成者が必要な場合は、データベースでそれを見つけるために別のリクエストを行う必要があります。ただし、ここのmongooseでは、populate()と呼ばれる巧妙な関数があり、追加のリクエストを明示的に行わずに、回答の情報を直接取得するために、前のリクエストにチェーンできます。
Story.findOne({ title: Nintendo }).populate('_creator')
戻ります
{
_creator : {
_id : A0jfdSMmEJj*9,
name: Sai,
age: 100,
stories : [fdsfdsfdsew38u, 89hr3232, ...]
},
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88]
}
}
しかし、多分、それは多すぎる情報であり、私たちは彼が書いた物語と彼の年齢と名前で十分ではありません。その後、Populateは、必要なフィールドを含む他の引数を取ることができます
Story.findOne({ title: Nintendo }).populate('_creator', 'name age')
結果==>
{
_creator : {
name: Sai,
age: 100,
},
title : Nintendo,
fans : [r432i900fds09809n, fdsjifdsjfueu88]
}
}