1

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

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

稍后您可以填充它。

但是有没有办法将不同集合的文档存储在同一个数组中?就像是:

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

显然这行不通,但你明白我的意思。

谢谢!

4

2 回答 2

2

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

第一个解决方案是将ObjectID没有refs 的 s 存储到另一个集合中:

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

它可以正常工作,但您需要指定要为每个查询填充的模型:

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

但我不确定您是否能够同时comments使用CommentAnswer模型进行填充。

另一种解决方案是使用 s 存储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 传递函数摆脱原始数组。

最后,您可以重新设计架构以将评论和答案存储在一个集合中,并为两者使用相同的 mongoose 模型。

于 2013-08-11T23:17:12.503 回答
0

mongoose 的 schema 类型支持混合类型,可以这样使用:

var questionSchema = new Schema({
    commentsAndAnswers: [Schema.Types.Mixed]
})

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

于 2013-08-11T22:20:19.637 回答