2016-11-24 11 views
0

Мне было поручено изменить существующий (большой) узел.js, используя mongoose.Заселено неявное и сколько уровней он может пройти?

Схема имеет Question, которая связывает в массив Answer следующим образом:

var QuestionSchema = mongoose.Schema({ 
    text: { type: String }, 
    ... 
    answers: [{type: mongoose.Schema.Types.ObjectId, ref: 'Answer'}], 
    ... 
}); 

var AnswerSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    question: { 
     type: mongoose.Schema.ObjectId, 
     ref: Question 
    }, 
... 
});  
var Question = mongoose.model('Story', QuestionSchema); 
var Answer = mongoose.model('Answer', AnswerSchema); 

Я не мог найти любой экземпляр метода populate используется в коде, но запрос в виде Question документа всегда возвращайтесь массивом полных объектов answer, а не только идентификатором объекта. Это то, что нужно.

Теперь я должен добавить массив из reaction объектов в answer. Я использовал следующий:

var Answer = mongoose.model('Answer', AnswerSchema); 
var ReactionSchema = mongoose.Schema({ 
    text: { type: String }, 
    .... 
    answer: { 
     type: mongoose.Schema.ObjectId, 
     ref: Answer, 
     //required: true 
    }, 
    ... 
}); 

Затем я добавил следующее к Answer схеме:

reactions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reaction'}] 
//where var Reaction = mongoose.model('Reaction', ReactionSchema); 

Я могу спасти reaction объектов, и когда я осмотрел содержимое базы данных из answer, то reaction объектов одинаковы по типу и форме до answer объектов в question.

Однако, когда question документ возвращается, каждый элемент answer.reaction содержит только идентификатор объекта reaction вместо полного reaction объекта. Что я пропустил или как сделать запрос для выполнения соединения на основе типа ref?

Версия mongodb 3.2.9, а mongoose - 4.0.4.

ответ

0

Как вы запрашиваете вопрос? Это, как вы можете разрешить вложенные ссылки:

Question.findById(id).populate({ 
    path: 'answer', 
    model: 'Answer', 
    populate: { 
    path: 'reaction', 
    model: 'Reaction' 
    } 
}).exec(function(err, data){}); 

Вот ссылка на мангуста документы: Mongoose Docs Deep Populate

+0

Спасибо. Ваш ответ дал мне ключ к решению проблемы. Моя версия монго вообще не имеет метода заполнения. Я потратил больше времени на перекодирование в существующий код и, наконец, нашел код, который вручную извлек объекты 'answer' из идентификаторов объектов, хранящихся в' question.answers', а затем добавил их в возвращаемый вопрос. –

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

  • Нет связанных вопросов^_^