4

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 の質問は、私が正しい方向に進んでいると信じさせてくれますが、おそらくマングースを誤用しているのでしょうか?

4

1 に答える 1

1

このように二重にネストされたオブジェクトを設定することは不可能のようです。まだそれを行う方法があるかもしれませんが、私はそれを見つけていません。ただし、それを行う別の方法は、次のように単純に行うことです。

Article.findById(articleId, function(err, article) {
    if (err) {
        ...
    } else {
        Comment
            .find({_id: {$in: article.comments}})
            .populate('createdBy', 'name email')
            .exec(function(err, comments) {
                if (err) {
                    ...
                } else {
                    console.log('First comment by %s', comments[0].createdBy.name)
                }
            })
    }
})
于 2013-12-19T21:26:17.090 に答える