2017-11-15 4 views
0

안녕하세요. 일부 사용자 레코드가있는 문서가 있습니다.MongoDB가 잘못된 배열 요소를 업데이트합니다.

"profile":{ 
    "records":[ 
       { 
       "classId": "LngdsQfL", 
       "moduleId": "5CDEezDJ", 
       "sectionId": "nFMu3mwa", 
       "dateFinished": "", 
       "dateOpened": "2017-11-15T19:48:20.819Z" 
       }, 
       { 
       "classId": "7Smq5sG", 
       "moduleId": "5CDEezDJ", 
       "sectionId": "nFMu3mwa", 
       "dateFinished": "", 
       "dateOpened": "2017-11-15T19:19:08.669Z" 
       } 
      ] 
     } 

그러나 두 번째 레코드를 업데이트하려고하면 첫 번째 쿼리가 업데이트됩니다. 그리고 두 번째 것은 똑같이 유지됩니다.

var classId= "7Smq5sG"; 
var moduleId = "5CDEezDJ"; 
var sectionId = "nFMu3mwa"; 
var date = new Date(); 

Users.update(
       { _id:Meteor.userId() , 

       'profile.records.classId' : classId, 
       'profile.records.moduleId' : moduleId, 
       'profile.records.sectionId' : sectionId, 
       },{ 
       $set : { 
       "profile.records.$.dateOpened": date 
       } 
      }); 
    } 

무엇이 누락 되었습니까?

+0

첫 번째 레코드를 업데이트한다고 어떻게 알 수 있습니까? 'Meteor.userId()'란 무엇입니까? –

+0

Meteor js를 사용 중이며 Meteor.userId()는 현재 사용자의 ID를 반환합니다. 데이터베이스를 검사 할 때 첫 번째 레코드가 업데이트 된 것을 볼 수 있습니다. – dionysosz

+0

MongoDB v3.6을 사용하면 다음 시간 내에 문자 그대로 릴리스됩니다. – dnickless

답변

2

다음과 같이 요청을 사용해보십시오 :

Users.update(
    {_id:Meteor.userId(), 
    'profile.records': {$elemMatch: { 
            'moduleId': {$eq: moduleId}, 
            'sectionId': {$eq: sectionId}, 
            'classId': {$eq: classId} 
            } 
         } 
    }, 
    {$set: {'profile.records.$.dateOpened': date}}); 

그것은 여러 쿼리 기준과 일치하는 배열 요소를 찾기 위해 $ elemMatch 연산자를 사용합니다.

+0

우수! 이것은 트릭을했다! 감사 – dionysosz

관련 문제