2014-06-12 4 views
-1

MongoDB documentation에 따르면 $ 연산자를 사용하여 쿼리 문서와 일치하는 포함 된 목록으로 콘텐츠를 업데이트 할 수 있습니다. 내 예는 좀 더 복잡한 설명서의 하나보다 :

db.item.insert({ 
    "_id" : ObjectId("5398786591846667374b8f7c"), 
    "outputs" : [ 
     { 
      "action" : "VIDEO", 
      "portalType" : "FACEBOOK", 
      "status" : 1 
     }, 
     { 
      "portalType" : "YOUTUBE", 
      "action" : "VIDEO", 
      "status" : 1 
     } 
    ] 
}) 

그리고 지금 나는 다음과 같은 쿼리를 수행

db.item.update(
{ _id: ObjectId('5398786591846667374b8f7c'), 
    "outputs.portalType": "YOUTUBE", 
    "outputs.action": "VIDEO" }, 
{ $set: { "outputs.$.status": NumberInt(99)}}) 

놀랍게도, 결과가를 그 출력의 첫 번째 요소 배열이 수정되었습니다 (portalType = FACEBOOK 인 수정). 내 검색어에 따르면 확실히 틀립니다 : "actions = VIDEO portalType = YOUTUBE"이 포함 된 출력.

http://s16.postimg.org/dyf4fmi6d/Untitled.png


편집 : 배열 내에서 여러 CRITERIAS 일치에 의해 제안처럼 모두가 $ elemMatch가 업데이트 명령의 쿼리 부분에 사용되어야 일치하고 있는지 확인하려면 Neil Lunn

+0

음. 샘플에 비해 업데이트에 다른 ObjectId 값이 있습니다. 나는 이것이 실제로 효과가 있다는 것을 알게 될 것이라고 생각합니다. 버그 사냥에 거품을 터뜨려 미안해. –

+0

감사합니다. 그건 그냥 오타 였고 오류가 계속;) –

+1

Nope. 나는 심지어 저 자신을 도망 쳤다. 올바른 배열 멤버를 업데이트합니다. 당신은 버그를 발견하지 못했습니다. –

답변

0

이것은 실제로 설계된대로 작동합니다. 결과 여기

db.item.update(
    { 
     "_id": ObjectId("5398786591846667374b8f7c"), 
     "outputs.portalType": "YOUTUBE", 
     "outputs.action": "VIDEO" 
    }, 
    { "$set": { "outputs.$.status": NumberInt(99) }} 
) 

됩니다 :

{ 
    "_id" : ObjectId("5398786591846667374b8f7c"), 
    "outputs" : [ 
      { 
        "action" : "VIDEO", 
        "portalType" : "FACEBOOK", 
        "status" : 1 
      }, 
      { 
        "portalType" : "YOUTUBE", 
        "action" : "VIDEO", 
        "status" : 99 
      } 
    ] 
} 

아마도 이것이 당신의 상태와 같은 문제가

다음
{ 
    "_id" : ObjectId("5398786591846667374b8f7c"), 
    "outputs" : [ 
      { 
        "action" : "VIDEO", 
        "portalType" : "FACEBOOK", 
        "status" : 1 
      }, 
      { 
        "portalType" : "YOUTUBE", 
        "action" : "VIDEO", 
        "status" : 1 
      } 
    ] 
} 

업데이트입니다 : 여기

데이터입니다 당신이 기대하는대로하지 않을 수도 있습니다 :

db.item.update(
    { 
     "_id": ObjectId("5398786591846667374b8f7c"), 
     "outputs": { 
      "$elemMatch": { 
       "portalType": "YOUTUBE", 
       "action": "VIDEO" 
      } 
     } 
    }, 
    { "$set": { "outputs.$.status": NumberInt(99) }} 
) 

는 그래서 $elemMatch있는지 모두 조건이 이전 형태가 가능 배열의 다른 구성원과 일치시킬 수 있으므로 배열 항목 내에서 존재한다. 경기는 "문서"에만 전체적으로 적용됩니다. enter image description here

갱신 명령의 마지막 줄과 수정 된 문서를 주목 :

그래서 여기 try.mongodb.org 출력됩니다.

+0

http://try.mongodb.org/에서 코드를 테스트했으며 쿼리 업데이트가 정확한 순서로 수행 될 때 작동합니다. 순서가 다음과 같은 경우 :' "_id": ObjectId ("5398786591846667374b8f7c"), "출력.action ":"VIDEO ","outputs.portalType ":"YOUTUBE "그리고 잘못된 것이 수정되었습니다. 직접 시도하십시오 –

+0

@DidacMontero Dude 방금 내가 올린 것 같습니까? –

+0

@DidacMontero 온라인 데모가 'NumberInt'을 이해하지 못한다고 불평하는 것 같습니다. 단지 웹 사이트 일 뿐이며 실제 MongoDB 인스턴스는 작동합니다. –