답변:
항목을 가져 와서 업데이트하면이 두 단계 사이에 다른 스레드가 업데이트 될 수 있습니다. 항목을 먼저 업데이트 한 다음 가져 오면 중간에 다른 업데이트가있을 수 있으며 업데이트 한 항목과 다른 항목이 다시 표시됩니다.
"원자 적으로"수행한다는 것은 업데이트하고있는 것과 정확히 동일한 항목을 다시 얻는다는 것을 의미합니다. 즉, 그 사이에 다른 작업이 발생하지 않습니다.
로부터 MongoDB를 워드 프로세서 (강조는 추가) :
기본적으로 두 작업 모두 단일 문서를 수정합니다. 그러나 multi 옵션이있는 update () 메소드는 여러 개의 document를 수정할 수 있습니다 .
findAndModify ()에 대해 여러 문서가 업데이트 기준과 일치하는 경우 업데이트 할 문서에 대한 제어 수단을 제공하기 위해 정렬 을 지정할 수 있습니다 . update () 메서드의 기본 동작을 사용하면 여러 문서가 일치 할 때 업데이트 할 단일 문서를 지정할 수 없습니다.
기본적으로 findAndModify () 메소드 는 사전 수정 된 문서 버전을 리턴합니다 . 업데이트 된 문서를 얻으려면 새 옵션을 사용하십시오. update () 메서드는 작업 상태가 포함 된 WriteResult 객체를 반환합니다. 업데이트 된 문서를 반환하려면 find () 메서드를 사용하십시오. 그러나 다른 업데이트로 인해 업데이트와 문서 검색간에 문서가 수정되었을 수 있습니다. 또한 업데이트가 단일 문서 만 수정했지만 여러 문서가 일치하는 경우 추가 논리를 사용하여 업데이트 된 문서를 식별해야합니다.
MongoDB 3.2 이전에는 findAndModify ()에 쓰기 문제를 지정하여 기본 쓰기 문제를 무시할 수 없지만 MongoDB 2.6 이후 update () 메소드에 쓰기 문제 를 지정할 수 있습니다 .
단일 문서를 수정할 때 findAndModify () 및 update () 메소드는 문서를 원자 적으로 업데이트합니다.
findAndModify()기본 수정 하나 개의 문서 및 의한 update()캔 업데이트 하나 이상의 문서, 내가를 사용 arrayFilters, findAndModify()모든 일치를 업데이트합니다. 아마도 버그입니까?
유용한 사용 사례 중 하나는 카운터 및 유사한 사례입니다. 예를 들어,이 코드 (MongoDB 테스트 중 하나) 인 find_and_modify4.js를 살펴보십시오 .
따라서 findAndModify카운터를 늘리면 한 단계에서 증가 된 값을 얻습니다. 비교 : (A)이 작업을 두 단계로 수행하고 다른 사람 (B)가 단계 사이에서 동일한 작업을 수행하는 경우 A와 B는 서로 다른 두 가지 대신 동일한 마지막 카운터 값을 얻을 수 있습니다 (가능한 문제의 한 예).
findAndModify다른 업데이트 작업을 방해하지 않도록하려면 어떻게 해야합니까?