2016-10-18 5 views
0

Я изо всех сил пытаюсь обновить элемент внутри вложенного расположения в mongoDB.Обновление элемента внутри вложенного массива mongoose

Допустим, у меня есть эта схема:

var question = new Schema({ 
    problem: { 
    type: String, 
    required: true 
    }, 
    multipleChoices: [{ 
    type: String, 
    required: true 
    }], 
    correctAnswer: { 
    type: Number, 
    required: true 
    } 
}); 

var testCategorySchema = new Schema({ 
    category: { 
    type: String, 
    required: true 
    }, 
    tests: [{ 
    version: { 
     type: String, 
     required: true 
    }, 
    questions: [question] 
    }] 
}); 

К примеру у меня есть экземпляр этой схемы, как это:

{ 
    category: "Math", 
    tests: [ 
    { 
     version: "1A", 
     questions: [ 
     { 
      problem: "blablabla", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ], 
      correctAnswer: 1 
     }, 
     { 
      problem: "blibliblibli", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     } 
     ] 
    }, 
    { 
     version: "1B", 
     questions: [ 
     { 
      problem: "auauauauau", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     }, 
     { 
      problem: "blibliblibli", 
      multiplechoices: [ 
      "bla bla", "blb blb", "blc blc" 
      ] 
      correctAnswer: 1 
     } 
     ] 
    } 
    ] 
} 

Как добавить новый вопрос в математике категории, когда тестовая версия : 1A использование mongooseJS?

ответ

0

Вы должны использовать update и $push с позиционным оператором $:

db.test.update(
    { 
     category: 'Math', 
     'tests.version': '1A' 
    }, 
    { 
     $push: { 
      'tests.$.questions': { 
       problem: 'test', 
       multiplechoices: ['a', 'b', 'c'], 
       correctAnswer: 1 
      } 
     } 
    } 
+0

Спасибо, я получил его. Но как я могу добиться этого с помощью мангуста? Я пытаюсь сделать это 'TestCategory .findOne ({category: req.params.TestCategory, tests: {$ elemMatch: {version: req.params.version}}})', это уже верно? – Kim

+0

просто используйте 'update' вместо' findOne' и соответствующим образом заполняйте значения ... здесь нет необходимости в '$ elemMatch', вот для чего' ''. – TomG

+0

все в порядке, но как я могу показать, как «Категория теста не найдена», если я использую только обновление? извините, все еще немного путайте hehe – Kim

0

Попробуйте это ..

Test.findOne({category:"Math", tests.version:"1A"}, function(err, result){ 
    if (!err && result) { 
    result.tests.questions.push({"new question"}); //push ur new question 
    var test = new Test(result); //this is ur mongoose mdel 
    test.save(function(err, result2){ //update 
     if(!err) { 
      console.log(result2); //updated result 
     } console.log(err); 
    }) 

    } else console.log(err); 
});