2016-02-25 3 views
0

Я хочу, чтобы хранить кучу вопросов и ответов в коллекции пользователя, так что один пользователь может иметь следующий хранится так:Как обновить вложенные многоуровневые записи в Mongodb?

{ 
    _id: '34ifujia0', 
    questions: [ 
     { 
      'questionId': 'someQuestion', 
      'answer': [ 
       { 
        'name': 'questionWithinQuestion', 
        'answer': 5 
       }, 
       { 
        'name': 'anotherQuestionWithinQuestion', 
        'answer': 10 
       } 
      ] 
     } 
    ] 
} 

Итак, есть несколько вопросов, и они могут быть многослойными держать несколько ответов. Поэтому, если большой вопрос: «Ранг этих цветов от 1 до 10» (просто глупый пример), тогда вопрос будет содержать {name: 'red', answer: 5}, {name: 'blue', answer: 10} для тех, кто действительно любит синий цвет.

Проблема возникает при попытке сохранить эту информацию. Я хочу добавить в ответы ответы на вопросы -1 или 1, но я не могу связаться с ними.

Я хотел бы сделать это:

update({_id: userId', 'questions.questionId': questionId'}, 
{$inc: {'questions.$.answer[name]': 1}}) 

где userId, questionId и name все правильные переменные.

(Edit:. На второй мысли, что не будет работать вообще мне действительно нужно использовать $ два раза после того, как все.)

Но этот синтаксис не допускается. Также не разрешено использовать $ дважды.

Что я могу сделать?

ответ

0

По этому вопросу Positional Operator Matching Nested Arrays, оператор с несколькими позициями $ НЕ может использоваться вложенными массивами в настоящее время.

Может быть, здесь есть одна работа вокруг

> db.collection.find({_id: userId, 'questions.questionId': questionId}) 
       .forEach(function(doc) { 
        doc.questions.map(function(q) { 
          if (q.questionId == questionId) { 
           q.answer.map(function(a) { 
            a.answer += 1; // or -= 1; 
           });   
          } 
        }); 
        db.collection.update({_id: doc._id}, 
              {$set: {questions: doc.questions}}); 
    }); 
Смежные вопросы