gpt4 book ai didi

mongodb - 我可以使用 MongooseJS "populate"子文档数组中的属性吗?

转载 作者:可可西里 更新时间:2023-11-01 09:15:30 33 4
gpt4 key购买 nike

关于 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.
});

但是如果我还想使用 populate 加载他们的创作者的评论,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 的 Mongoose 对象 ID(并且它与现有用户匹配)。

这可能吗?
- 如果是这样,我哪里出错了?
- 如果没有,什么是更好的方法来解决这个问题? MongoDB 问题,如 this one让我相信我走在正确的轨道上,但也许误用了 Mongoose ?

最佳答案

像这样填充双重嵌套对象似乎是不可能的,可能仍然有办法做到这一点,但我还没有遇到过。然而,另一种方法可能是简单地这样做:

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)
}
})
}
})

关于mongodb - 我可以使用 MongooseJS "populate"子文档数组中的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795617/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com