将不同集合的文档存储在同一个数组中

时间:2013-08-11 12:47:59

标签: mongoose

在Mongoose中,您可以执行以下操作:

var questionSchema = new Schema({
  comments: [{type: ObjectId, ref: 'Comment'}]
})

以后你可以populate

但是有没有办法在同一个数组中存储不同集合的文档?类似的东西:

var questionSchema = new Schema({
  commentsAndAnswers: [{type: ObjectId, ref: 'Comment'}, {type: ObjectId, ref: 'Answer'}]
})

显然这不起作用,但你明白我的意思。

谢谢!

2 个答案:

答案 0 :(得分:2)

我可以针对您的问题提出三种解决方案。

第一个解决方案是将ObjectID s ref s存储到其他集合中:

var questionSchema = new Schema({
  comments: [ObjectId]
})

它会正常工作,但每个查询都需要specify the model to populate

Question.findOne().populate('comments', Answer).exec(next)

但我不确定您是否能够使用commentsComment模型填充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]
})

然后,您应该能够将具有任何模式类型的文档插入此字段。