2016-10-18 2 views
0

mongoDB에서 중첩 된 arrray 내부의 요소를 업데이트하는 데 어려움을 겪고 있습니다. 테스트 버전 일 때 나는 수학 카테고리에 새로운 질문을 추가 할 수있는 방법중첩 된 배열 안에 요소를 업데이트합니다.

{ 
    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 
     } 
     ] 
    } 
    ] 
} 

을 :

예를 들어
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] 
    }] 
}); 

이 같은 스키마의 인스턴스가 :

내가이 스키마가 있다고 가정하자 : 1MongooseJS를 사용하는 1A?

답변

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

'findOne' 대신'update' 만 사용하고 그에 따라 값을 채 웁니다 ...'$ elemMatch'는'$ elemMatch'가 필요 없습니다. – TomG

+0

괜찮습니까.하지만 업데이트 만 사용하는 경우 어떻게 "테스트 카테고리를 찾을 수 없습니다"와 같이 표시 할 수 있습니까? 미안하지만 여전히 조금 혼란스러워 – 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); 
});