mongoose の populate 機能について多くの SO の質問がありますが、これが可能かどうかの証拠を見つけることができませんでした。
ブログを書いているとしましょう。わーい。すべてのユーザーは、記事を書いたり、他の記事にコメントを投稿したりできます。私はこのように物事をモデル化することにしました:
ユーザー:
var UserSchema = new Schema({
name: String,
email: {
type: String,
unique: true
}
});
mongoose.model('User', UserSchema);
コメントが埋め込まれた記事:
var ArticleSchema = new Schema({
title: {
type: String
},
createdBy: {
type: Schema.ObjectId,
ref: 'User'
},
comments: [
commentsSchema
]
)};
var commentSchema = new Schema({
message: {
type: String
},
createdBy: {
type: Schema.ObjectId,
ref: 'User'
}
});
mongoose.model('Article', ArticleSchema);
記事をロードしたいときは、mongooseJS populateを使用して、次のように作成者とともに記事をロードできます。
Article
.findOne({_id: articleid})
.populate('createdBy', 'name email')
.exec(function(err,article) {
console.log('Created by %s', article.createdBy.name); // This works, yay.
});
しかし、populate を使用して THEIR クリエイターのコメントも読み込みたい場合、comment.createdBy は null です。
Article
.findOne({_id: articleid})
.populate('createdBy', 'name email')
.populate('comments.createdBy', 'name email') //am I doing this correctly?
.exec(function(err,article) {
console.log('First comment by %s', article.comments[0].createdBy.name); // Error, createdBy is null.
});
その最後のバージョンでは、article.comments[0].createdBy が null であることがわかります。データベースで、コメントにcreatedByのmongooseオブジェクトIDがあること(およびそれが既存のユーザーと一致すること)を確認しました。
これは可能ですか?
- もしそうなら、どこが間違っていますか?
- そうでない場合、これを行うためのより良い方法は何ですか? このような MongoDB の質問は、私が正しい方向に進んでいると信じさせてくれますが、おそらくマングースを誤用しているのでしょうか?