findAndModify
MongoDB 의 메소드에 약간 혼란 스럽습니다 . update
방법 보다 장점은 무엇입니까 ? 저에게는 항목을 먼저 반환 한 다음 업데이트하는 것 같습니다. 하지만 왜 먼저 반품해야합니까? 나는 MongoDB : 명확한 가이드를 읽었으며 큐를 조작하고 가져 오기 및 설정 스타일 원 자성이 필요한 다른 작업을 수행하는 데 편리하다고 말합니다. 그러나 이것이 어떻게 달성되는지 이해하지 못했습니다. 누군가 나에게 이것을 설명 할 수 있습니까?
답변
항목을 가져 와서 업데이트하면이 두 단계 사이에 다른 스레드가 업데이트 될 수 있습니다. 항목을 먼저 업데이트 한 다음 가져 오면 중간에 다른 업데이트가있을 수 있으며 업데이트 한 항목과 다른 항목이 다시 표시됩니다.
“원자 적으로”수행한다는 것은 업데이트하고있는 것과 정확히 동일한 항목을 다시 얻는다는 것을 의미합니다. 즉, 그 사이에 다른 작업이 발생하지 않습니다.
답변
findAndModify
문서를 반환하고 업데이트하지 않습니다.
Dwight Merriman (mongoDB의 원저자 중 하나)을 올바르게 이해했다면 update를 사용하여 단일 문서를 수정하는 것 즉 ( “multi”: false}도 원 자성입니다. 현재는을 사용하는 동등한 업데이트를 수행하는 것보다 빠릅니다 findAndModify
.
답변
로부터 MongoDB를 워드 프로세서 (강조는 추가) :
기본적으로 두 작업 모두 단일 문서를 수정합니다. 그러나 multi 옵션이있는 update () 메소드는 여러 개의 document를 수정할 수 있습니다 .
findAndModify ()에 대해 여러 문서가 업데이트 기준과 일치하는 경우 업데이트 할 문서에 대한 제어 수단을 제공하기 위해 정렬 을 지정할 수 있습니다 . update () 메서드의 기본 동작을 사용하면 여러 문서가 일치 할 때 업데이트 할 단일 문서를 지정할 수 없습니다.
기본적으로 findAndModify () 메소드 는 사전 수정 된 문서 버전을 리턴합니다 . 업데이트 된 문서를 얻으려면 새 옵션을 사용하십시오. update () 메서드는 작업 상태가 포함 된 WriteResult 객체를 반환합니다. 업데이트 된 문서를 반환하려면 find () 메서드를 사용하십시오. 그러나 다른 업데이트로 인해 업데이트와 문서 검색간에 문서가 수정되었을 수 있습니다. 또한 업데이트가 단일 문서 만 수정했지만 여러 문서가 일치하는 경우 추가 논리를 사용하여 업데이트 된 문서를 식별해야합니다.
MongoDB 3.2 이전에는 findAndModify ()에 쓰기 문제를 지정하여 기본 쓰기 문제를 무시할 수 없지만 MongoDB 2.6 이후 update () 메소드에 쓰기 문제 를 지정할 수 있습니다 .
단일 문서를 수정할 때 findAndModify () 및 update () 메소드는 문서를 원자 적으로 업데이트합니다.
답변
유용한 사용 사례 중 하나는 카운터 및 유사한 사례입니다. 예를 들어,이 코드 (MongoDB 테스트 중 하나) 인
find_and_modify4.js를 살펴보십시오 .
따라서 findAndModify
카운터를 늘리면 한 단계에서 증가 된 값을 얻습니다. 비교 : (A)이 작업을 두 단계로 수행하고 다른 사람 (B)가 단계 사이에서 동일한 작업을 수행하는 경우 A와 B는 서로 다른 두 가지 대신 동일한 마지막 카운터 값을 얻을 수 있습니다 (가능한 문제의 한 예).
답변
카운터 연산 (inc 또는 dec)에 대해 findAndModify ()를 사용했으며 다른 단일 필드는 케이스를 변경했습니다. 우리의 응용 프로그램을 Couchbase에서 MongoDB로 마이그레이션 하면서이 API는 GetAndlock ()을 수행하는 코드를 바꾸고, 로컬로 내용을 수정하고, replace ()를 저장하고 Get ()을 다시 업데이트하여 업데이트 된 문서를 다시 가져 오는 것으로 나타났습니다. mongoDB에서는 방금 업데이트 된 문서를 반환하는이 단일 API를 사용했습니다.
답변
