关于 mongoose 的填充功能有很多 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.
});
但是,如果我还想使用填充加载他们的创建者的评论,comment.createdBy 为空:
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 为空。我已经验证在数据库中,评论有一个 createdBy 的猫鼬对象 ID(并且它与现有用户匹配)。
这可能吗?
- 如果是这样,我哪里错了?
- 如果没有,有什么更好的方法来解决这个问题?像这样的MongoDB 问题让我相信我走在正确的轨道上,但也许误用了 mongoose?