2014-03-06 2 views
0

나는 다음과 같은 기록했다 : 기록은 두 개의 하위 문서를 가지고

db.p.save(r); 

을 :

r = { 
    "_children" : { 
     "addressesR" : [ 
      { 
       "street" : "Bitton", 
       "city" : "Perth", 
       "id" : ObjectId("5317c149f45dfdb114deec41") 
      }, 
      { 
       "id" : ObjectId("5317c149f45dfdb114deec42"), 
       "street" : "Ivermey", 
       "city" : "Perth", 
     ], 
    }, 
    "_searchData" : { 
     "addressesR" : [ 
      { 
       "street" : "BITTON", 
       "city" : "PERTH", 
       "id" : ObjectId("5317c149f45dfdb114deec41") 
      }, 
      { 
       "id" : ObjectId("5317c149f45dfdb114deec42"), 
       "street" : "IVERMEY", 
       "city" : "PERTH", 
      } 
     ], 
    }, 
} 

그냥 저장 한 아이의리스트를 가지고 있으며, 다른 하나는의 동일한 목록이 있습니다 아이들이지만 대문자로 (검색 목적으로).

업데이트 할 때 둘 다 업데이트 할 수 있어야합니다. 이제 작동합니다 :

db.p.update({ '$and': [ 
    { '_searchData.addressesR.street': 'BITTON' } ] }, 
    { '$set': { 
    '_searchData.addressesR.$.street':'BITTON CHANGED' , 
    '_children.addressesR.$.street': 'Bitton CHANGED' 
    } 
}) 

$ 연산자는 위치 연산자입니다. 따라서 위치가 일치하면 제대로 작동합니다. 그러나 어떤 이유로 든 지위가 일치하지 않으면 재난으로 향하고 있다고 생각합니다.

이제는 항상 $ 두 개의 배열을 동시에 밀어 넣을 수 있으며, 같은 mongoDb 쿼리 내에서 동시에 $ I를 가져 오는 것이 좋습니다.

또한 데이터베이스에 복제가 진행되는 환경에서이 작업이 수행됩니까 (위치는 항상 항상 동일합니다)?

(참고 :이 하나 개의 레코드 내에서 어린이 레코드를 취득하는 자동 메커니즘의 최종 결과입니다.)

+0

배열의 서브 세트와 일치시키기 위해 각각'$ elemMatch'를 사용하는 두 가지 다른 업데이트를 실행해야한다고 생각합니다. 아마 배열이 동기식으로 위치를 벗어나지 않는다고 가정하는 것보다 안전 할 수도 있습니다 ? – Merc

+0

종류는 방법입니다. 나는 그것에 대한 메모와 미래의 고려 사항을 응답으로 줄 수 있습니다. –

답변

1

당신은 당신이 올바른 궤도에있을 것으로 보인다 의견을 고려. 알고 계시 겠지만 positional $ 연산자는 검색어에 일치하는 첫 번째 배열 요소의 색인이있는 "값"컨테이너 일뿐입니다.

당신 "수" 사용 당신은 항상 두 배열 같은 수의 요소가 포함되어 있고이 해당 항목이 항상 같은 위치에 있다고 절대적으로 확인한다면.

그래서 그래, 안전을 위해, 여기에 유일한 고려 사항 때문에이 읽기 인이 업데이트입니다 그래서

db.p.update({ '$and': [ 
    { '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } } ] }, 
    { '$set': { 
    '_searchData.addressesR.$.street':'BITTON CHANGED' , 
    } 
}) 

db.p.update({ '$and': [ 
    { '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } } ] }, 
    { '$set': { 
    '_children.addressesR.$.street': 'Bitton CHANGED' 
    } 
}) 

처럼 업데이트 작업으로 $elemMatch를 사용 문서 은 해당 업데이트 사이에이 될 수 있으며 _searchData_children 문서는 에 해당하는 ent가 동일하지 않습니다. 배열은 addressesR입니다.

두 작업 모두 두 번째 노드에서 재생이어야합니다.

좋은 기능이 무엇이겠습니까 업데이트 쿼리의 $ elemMatch를 사용할 수 있습니다. 그런 식으로 그면에있는 요소의 위치를 ​​쿼리하게됩니다. 그러나 이것은 존재하지 않습니다 아직. 그러나 2.6 위쪽으로는 같은 것을 할 수 있습니다 Bulk Update에서 매뉴얼 페이지에서 설명합니다

db.runCommand({ 

    "update": "p", 

    "updates": [ 
     { 
      "q": { '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } }, 

      "u": { 
       "$set": { 
        "_children.addressesR.$.street": "Bitton CHANGED" 
       } 
      } 
     }, 
     { 
      "q": { '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } }, 

      "u": { 
       "$set": { 
        "_searchData.addressesR.$.street": "BITTON CHANGED" 
       } 
      } 
     } 

    ] 
}) 

.

관련 문제