2012-01-26 2 views
1

This page은 이전에 검색된 (찾기) 문서에 도달하고이를 업데이트하기 위해 하위 요소 (배열)에 쿼리를 업데이트하는 것을 보여줍니다. 나는 똑같은 일을 꽤 많이 할 필요가있다. 예제에 대한 코드 : 지배하는 규칙은 무엇mongodb find 업데이트 의미 다음에

> t.find() 
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", 
    "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] } 

> t.update({'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true) 

는 발견 - 다음 -에 의해 업데이트, 나는 문서에서 이에 대한 설명을 발견하지 않았습니다. 드라이버를 통해 mongodb 사용에도 동일한 내용이 적용됩니까? 관련 의미에 대한 링크가 도움이 될 것입니다. C++ 드라이버를 사용하고 있습니다.

편집 : 자동 응답

2 개 명령을 합해서 하나로 할 수 있습니다 (이이 질문이 제기 모호성 제거하는 방법 중 하나입니다)하는 배열을 참조 할 수있는 업데이트의 쿼리 부분을 하위 요소이며, $ 심볼은이를 참조합니다. 업데이트 작업의 쿼리 부분에서 하나의 하위 요소 만 참조 할 수 있다고 가정합니다. 다음과 같이 내 경우에는 업데이트 작업은 같습니다

db.qrs.update ({ "_id" : ObjectId("4f1fa126adf93ab96cb6e848"), "urls.u_id" : 171 }, { "$inc" : { "urls.$.CC": 1} }) 

_id 제대로 "소수가"우측 고유 행, 두 번째 쿼리 요소 "urls.u_id" : 171 문제의 행이 오른쪽 필드를 가지고 있음을 보장합니다. urls.$.CC 다음 올바른 배열 항목을 $inc 작업을 라우팅합니다.

어떤 MongoDB를 dev에 또는 문서 작가에 대한 권고가이

그들을 잠재적 경쟁 조건을 가지고 예를 표시하지 않습니다. 원자 적으로 수행 할 수있는 여러 작업 표시를 항상 방지하십시오.

+0

@ 스스로 대답. 예제에 2 단계 작업이 있다고 잘못 가정합니다. 그렇지 않습니다. 저자는 컬렉션에있는 문서의 구조를 업데이트 예제를 표시하기 전에 find를 사용하여 독자에게 보여 주기만하면됩니다. –

답변

2

이 규칙은 비교적 간단합니다. 업데이트 결과는 많은 것들 (slave 세트에 대한 true/false, repsets와의 update/find, 다른 연결을 사용하는 find/safe)에 따라 후속 읽기에 사용되거나 사용되지 않을 수 있습니다. 안전한 쓰기 (w> = 1)를 수행하고 동일한 연결에서 찾기를 수행하는 경우 사용할 수 있음을 보장 할 수 있습니다. 대부분의 드라이버는 이에 대한 기능을 제공합니다 (일반적으로 "requestStart"및 "requestDone").

모두에게 더 좋은 해결책이 있습니다. 즉 findAndModify입니다. 이 작업은 문서를 찾고 업데이트하고 이전 버전의 문서 또는 새로 업데이트 된 버전을 반환합니다. 이 명령은 C++ 드라이버에서 사용할 수 있습니다. 참조 모양은 여기를 참조하십시오 : http://www.mongodb.org/display/DOCS/findAndModify+Command

EDIT : 예제에서 "찾기"는 문서의 독자에게 모음의 문서 구조/스키마가 다음 " 컨텍스트에서 "업데이트"합니다. "업데이트"작업은 전에 "찾기"작업의 영향을받지 않습니다.

+0

나는 발견 한 후에 규칙을 의미했다. 't.update ({ 'comments.by':'joe'} ...)'는 이전 찾기 작업에서 고유하게 식별 된 객체를 참조합니다. D. 어떤 종류의 말을하는거야? "find가 이전의 고유 한 행을 찾으면 후속 업데이트 작업에서 사용할 수 있도록합니다. : D –

+0

흠? 아니 서로 상관 없습니다. 업데이트 작업은 일치하는 문서를 찾습니다. 찾기는 그림으로 만 나타나며 모양이나 양식은 그 다음에 오는 업데이트 작업에 영향을 미치지 않습니다. –

+0

이 경우 쿼리는 모든 기사에서 "Joe의 의견"투표 수를 업데이트한다고 말하고 있습니까? 그것은 그 예가 보여주고 자하는 것입니까? 첫 번째 발견은 특정 기사를 준비합니다. 예와 현실적인 유스 케이스로서 특정 기사 내의 주석에 업 보트가있는 경우에만 의미가 있습니다. –

관련 문제