在Mongoose中,您可以执行以下操作:
var questionSchema = new Schema({
comments: [{type: ObjectId, ref: 'Comment'}]
})
以后你可以populate。
但是有没有办法在同一个数组中存储不同集合的文档?类似的东西:
var questionSchema = new Schema({
commentsAndAnswers: [{type: ObjectId, ref: 'Comment'}, {type: ObjectId, ref: 'Answer'}]
})
显然这不起作用,但你明白我的意思。
谢谢!
答案 0 :(得分:2)
我可以针对您的问题提出三种解决方案。
第一个解决方案是将ObjectID
s ref
s存储到其他集合中:
var questionSchema = new Schema({
comments: [ObjectId]
})
它会正常工作,但每个查询都需要specify the model to populate:
Question.findOne().populate('comments', Answer).exec(next)
但我不确定您是否能够使用comments
和Comment
模型填充Answer
。
另一个解决方案是将comments
存储为ref
的对象:
var questionSchema = new Schema({
comments: [{
comment: {type: ObjectId, ref: 'Comment'}
answer: {type: ObjectId, ref: 'Answer'}
}]
})
现在,您可以在一个查询中填充注释和答案:
Question.findOne().populate('comments.comment comments.answer').exec(next)
如果您想在单个数组中看到它们,可以添加virtual:
questionSchema.virtual('comments_and_answers').get(function () {
return this.comments.map(function (c) {
return c.comment || c.answer
});
})
您可以使用toObject transfer function删除原始数组。
最后,您可以重新设计架构,将评论和答案存储在一个集合中,使用相同的mongoose模型。
答案 1 :(得分:0)
mongoose的架构类型支持mixed类型,您可以像这样使用它:
var questionSchema = new Schema({
commentsAndAnswers: [Schema.Types.Mixed]
})
然后,您应该能够将具有任何模式类型的文档插入此字段。