2014-05-15 3 views
1

애트리뷰트의 임베디드 임베디드 값을 업데이트 할 수 있는지 궁금합니다.임베디드 임베디드 애트리뷰트 (MongoDB)의 값을 수정하십시오.

예를 들어, 나는 다음과 같은 문서가있는 경우 :

{ 
    _id: ObjectId("5372523e4f611ef8255c5735"), 

    places: [ 
     { 
      idPlace: 2, 
      namePlace: "Name of the place 2", 
      typePlace: "Type of the place 2" 
      }, 
      screens: [ 
       { 
        idScreen: 1, 
        nameScreen: "Name 1 of the screen", 
        statusScreen: false 
       }, 
       { 
        idScreen: 2, 
        nameScreen: "Name 2 of the screen", 
        statusScreen: false 
       }, 
       { 
        idScreen: 3, 
        nameScreen: "Name 3 of the screen", 
        statusScreen: false 
       } 
     }, 
     { 
      idPlace: 3, 
      namePlace: "Name of the place 3", 
      typePlace: "Type of the place 3" 
      }, 
      screens: [ 
       { 
        idScreen: 5, 
        nameScreen: "Name 5 of the screen", 
        statusScreen: false 
       }, 
       { 
        idScreen: 6, 
        nameScreen: "Name 6 of the screen", 
        statusScreen: false 
       }, 
       { 
        idScreen: 7, 
        nameScreen: "Name 7 of the screen", 
        statusScreen: false 
       } 
     } 
    ] 
} 

을 내가 true'idScreen': 5의 속성 'statusScreen'의 값을 수정하고 싶었다. 그래서 (포스트 Updating embedded document property in Mongodb에 따라) 다음 명령을 시도 :

db.mycollection.update( {'places.screens': {$elemMatch: {'idScreen': 5} }}, { $set: { "online": true }}, { multi: true }); 

을하지만 내 문서의 루트 나에게 속성 'online': true을 만들어 내 원하는 속성의 값을 수정하지 않습니다.

무엇이 잘못 되었습니까?

최저 루이는 이론적으로

답변

0

당신은 위치 운영자 $ 특정 항목과 일치를 업데이트해야합니다. 하지만 문제는 위치의 위치를 ​​일치시키고 화면의 위치를 ​​일치시키는 데 두 개의 위치 연산자 $를 사용해야한다는 것입니다. 불행히도 두 위치 연산자의 사용은 아직 지원되지 않습니다. https://jira.mongodb.org/browse/SERVER-831을 참조하십시오.

따라서 한 번의 쿼리로 문서를 업데이트 할 수 없습니다.

그러나 {{places.screens.idScreen ': 5}} 쿼리를 사용하여 필요한 모든 문서를 찾은 다음 배열의 알려진 위치를 기반으로 문서를 업데이트 할 수 있습니다.

편집 : 코드는 배열에

db.coll.update(
    {'places.screens.idScreen': 5}, 
    {$set:{"places.0.screens.0.statusScreen":true}} 
) 
+0

주셔서 감사합니다 정말 빠른 답변에 대한 많은 특정 요소를 업데이트합니다. 그래서 나는 2 개의'$ '로 내 속성에 접근 할 수 없다는 것을 알았고, {places.screens.idScreen': 5}로 모든 문서를 검색 할 수 있다는 것을 알았지 만, 내 속성의 중첩 된 값을 수정하는 방법 'idScreen : 5' 제발? – LoicDpointgroup

+0

set 문을 {$ set : "places.0.screens.0.statusScreen": true}} 또는 이와 유사한 것으로 바꾸어 특정 중첩 된 중첩 항목 –

+0

을 업데이트합니다. db.mycollection.update ({ 'places.screens.idScreen ': 5}, {$ set : "places.0.screens.0.statusScreen": true}}, {multi : true});'스크린 '서브 문서의 루트에 속성을 생성합니다. 그리고 다음과 같이 : db.mycollection.update ({ 'places.screens.idScreen': 72}, {$ set : "places. $ screens.0.statusScreen": true}}, {multi : true}); 화면 서브 문서의 첫 x 째 속성 값을 변경합니다. 나는 당신에게 올바른 솔루션 덕분에 가까운 것 같아요 ... 내 'idScreen': 5가있는 인덱스 위치를 검색하는 방법을 찾아야합니다. – LoicDpointgroup

관련 문제