2012-02-12 2 views
12

에서 특정 요소를 업데이트MongoDB를 내가 다음 스키마의 컬렉션이 부분 배열

내가 _id = 28 하지만 함께 문서의 배열의 요소 중 하나를 업데이트 할 필요가
{ 
    "_id" : 28, 
    "n" : [{ 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 28, 
     "p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8466e46b3b8140e000000"), 
     "c" : 10, 
     "p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")], 
     "u" : 26 
    }, { 
     "a" : ObjectId("4ef8467846b3b8780d000001"), 
     "u" : 26, 
     "p" : [ObjectId("4f00637b46b3b8cc0e000000")], 
     "c" : 28 
    }, { 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "u" : 26, 
     "p" : [ObjectId("4f00631046b3b85002000000")], 
     "c" : 28 
    }] 
} 

단지는 A의 경우 = 어떤 가치와 C =

db.coll.update({ 
'_id' : 28, 
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'), 
'n.c' : 28 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

그래서 기본적으로 내가 특정 배열 요소를 업데이트 할 몇 가지 값 : 지금까지 사람이 볼 수 와,이 네 번째 요소입니다. 문제는 쿼리가 실행될 때 첫 번째 요소를 업데이트 할 가능성이 높다는 것입니다.

어떻게 해결할 수 있습니까?

답변

23

코드의 문제는 dot-notation입니다. 점 표기법을 지정할 때 지정된 필터 조건이 모든 조건을 충족하는 단일 배열 요소와 일치해야한다고 가정하기 때문입니다. 그러나 그것은 doesnt한다. 배열의 점 표기법은 단일 조건이 일치하는 경우 배열 요소를 가져올 수 있습니다. 그것이 예상치 못한 업데이트를 얻는 이유입니다.

array 요소의 모든 필터와 일치 시키려면 $elemMatch을 사용해야합니다.

db.coll.update({ 
'_id' : 28, 
n: { 
    $elemMatch:{ 
     a : new ObjectId('4ef85a3e46b3b84408000000'), 
     c : 28 } 
    } 
}, 
{ 
    $push : { 
    'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74") 
    }, 
    $set : { 
    'n.$.t' : ISODate("2013-05-13T14:22:46.777Z") 
    } 
}) 

및 출력

{ 
     "a" : ObjectId("4ef85a3e46b3b84408000000"), 
     "c" : 28, 
     "p" : [ 
      ObjectId("4f00631046b3b85002000000"), 
      ObjectId("4b97e62bf1d8c7152c9ccb74") 
     ], 
     "t" : ISODate("2013-05-13T14:22:46.777Z"), 
     "u" : 26 
    } 
이다