2013-08-11 2 views
0

В 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

Я могу предложить три решения для вашей проблемы.

Первое решение для хранения ObjectID сек без ref с к другой коллекции:

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.

Наконец,, вы можете пересмотреть схему, чтобы хранить комментарии и ответы в одной коллекции, используя ту же модель мангуста для обоих.

0

Тип схема мангуста поддерживает mixed типа, вы можете использовать его как это:

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

Тогда вы должны быть в состоянии вставить документ с любым типом схемы в этой области.

Смежные вопросы