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

あなたの問題に対して 3 つの解決策を提案できます。

最初の解決策ObjectIDは、 s なしでrefs を他のコレクションに格納することです。

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

問題なく動作しますが、クエリごとに入力するモデルを指定する必要があります。

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

しかし、とモデルcommentsの両方を使用してデータを入力できるかどうかはわかりません。CommentAnswer

もう 1 つの解決策は、 scommentsを使用してオブジェクトとして保存することです。ref

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

1 つのクエリでコメントと回答の両方を入力できるようになりました。

Question.findOne().populate('comments.comment comments.answer').exec(next)

それらを単一の配列で表示したい場合は、仮想を追加できます:

questionSchema.virtual('comments_and_answers').get(function () {
  return this.comments.map(function (c) {
    return c.comment || c.answer
  });
})

toObject transfer functionを使用して、元の配列を取り除くことができます。

最後に、両方に同じマングース モデルを使用して、コメントと回答を 1 つのコレクションに格納するようにスキーマを再設計することができます。

于 2013-08-11T23:17:12.503 に答える
0

mongoose のスキーマ タイプは混合タイプをサポートしており、次のように使用できます。

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

次に、任意のスキーマ タイプのドキュメントをこのフィールドに挿入できるはずです。

于 2013-08-11T22:20:19.637 に答える