MongoDB에서 findAndModify와 업데이트의 차이점은 무엇입니까?


175

findAndModifyMongoDB 의 메소드에 약간 혼란 스럽습니다 . update방법 보다 장점은 무엇입니까 ? 저에게는 항목을 먼저 반환 한 다음 업데이트하는 것 같습니다. 하지만 왜 먼저 반품해야합니까? 나는 MongoDB : 명확한 가이드를 읽었으며 큐를 조작하고 가져 오기 및 설정 스타일 원 자성이 필요한 다른 작업을 수행하는 데 편리하다고 말합니다. 그러나 이것이 어떻게 달성되는지 이해하지 못했습니다. 누군가 나에게 이것을 설명 할 수 있습니까?

답변:


153

항목을 가져 와서 업데이트하면이 두 단계 사이에 다른 스레드가 업데이트 될 수 있습니다. 항목을 먼저 업데이트 한 다음 가져 오면 중간에 다른 업데이트가있을 수 있으며 업데이트 한 항목과 다른 항목이 다시 표시됩니다.

"원자 적으로"수행한다는 것은 업데이트하고있는 것과 정확히 동일한 항목을 다시 얻는다는 것을 의미합니다. 즉, 그 사이에 다른 작업이 발생하지 않습니다.


6
나는 아직도 약간 혼란 스럽다. findAndModify다른 업데이트 작업을 방해하지 않도록하려면 어떻게 해야합니까?
chaonextdoor

78
@chaonextdoor findAndModify는 작업을 시작할 때 데이터베이스에 대한 잠금을 획득하여 다른 작업이 실행될 때 처리 할 수 ​​없도록합니다. 작업이 끝나면 잠금이 해제됩니다.
Lycha

4
findAndModify는 요청의 수정 부분까지 실제로 잠금을 얻지 않습니다. 따라서 여러 프로세스가 동일한 레코드를 업데이트 할 수 있습니다.
Mark Unsworth

5
@MarkUnsworth는 10gen으로 지원 사례를 엽니 다. findAndModify로 잠금하는 데 버그가 있으면 엔지니어가 최대한 빨리 고칠 수 있음을 보증 할 수 있습니다. 이 경우 많은 사람들 이이 동작을보고하지만 findAndModify는 그것을 사용하는 거의 모든 사람을 위해 설계된대로 작동합니다. 클라이언트 측의 논리 또는 구현 버그로 인한 것이 아닌 것처럼 보이는 경우 그러나 복잡한 소프트웨어에는 항상 버그가있을 수 있습니다.
Asya Kamsky

4
@AsyaKamsky 나는 당신과 논쟁하는 것을 고려하고 있었지만 당신이 옳다는 것을 깨달았으므로 이제 사과해야한다고 생각합니다. 죄송합니다!
funkyeah

54

findAndModify 문서를 반환하고 업데이트하지 않습니다.

Dwight Merriman (mongoDB의 원저자 중 하나)을 올바르게 이해했다면 update를 사용하여 단일 문서를 수정하는 것 즉 ( "multi": false}도 원 자성입니다. 현재는을 사용하는 동등한 업데이트를 수행하는 것보다 빠릅니다 findAndModify.


31

로부터 MongoDB를 워드 프로세서 (강조는 추가) :

  • 기본적으로 두 작업 모두 단일 문서를 수정합니다. 그러나 multi 옵션이있는 update () 메소드는 여러 개의 document를 수정할 수 있습니다 .

  • findAndModify ()에 대해 여러 문서가 업데이트 기준과 일치하는 경우 업데이트 할 문서에 대한 제어 수단을 제공하기 위해 정렬지정할 수 있습니다 . update () 메서드의 기본 동작을 사용하면 여러 문서가 일치 할 때 업데이트 할 단일 문서를 지정할 수 없습니다.

  • 기본적으로 findAndModify () 메소드 사전 수정 된 문서 버전을 리턴합니다 . 업데이트 된 문서를 얻으려면 새 옵션을 사용하십시오. update () 메서드는 작업 상태가 포함 된 WriteResult 객체를 반환합니다. 업데이트 된 문서를 반환하려면 find () 메서드를 사용하십시오. 그러나 다른 업데이트로 인해 업데이트와 문서 검색간에 문서가 수정되었을 수 있습니다. 또한 업데이트가 단일 문서 만 수정했지만 여러 문서가 일치하는 경우 추가 논리를 사용하여 업데이트 된 문서를 식별해야합니다.

  • MongoDB 3.2 이전에는 findAndModify ()에 쓰기 문제를 지정하여 기본 쓰기 문제를 무시할 수 없지만 MongoDB 2.6 이후 update () 메소드에 쓰기 문제지정할 수 있습니다 .

단일 문서를 수정할 때 findAndModify () 및 update () 메소드는 문서를 원자 적으로 업데이트합니다.


1
업데이트 작업에 항상 쓰기 문제를 지정할 수 있습니다. 또한 3.2 (기술적으로 3.1.1)부터 findAndModify에 쓰기 문제를 지정할 수 있습니다. jira.mongodb.org/browse/SERVER-6558
Asya Kamsky

내가 발견 한 그 문서 상태에 있지만, MongDB 3.6의 findAndModify()기본 수정 하나 개의 문서 및 의한 update()캔 업데이트 하나 이상의 문서, 내가를 사용 arrayFilters, findAndModify()모든 일치를 업데이트합니다. 아마도 버그입니까?
WesternGun

버그가 없습니다-arrayFilters를 사용하면 여러 배열 요소를 업데이트 할 수 있지만 여전히 단일 문서에 있습니다.
Asya Kamsky

10

유용한 사용 사례 중 하나는 카운터 및 유사한 사례입니다. 예를 들어,이 코드 (MongoDB 테스트 중 하나) 인 find_and_modify4.js를 살펴보십시오 .

따라서 findAndModify카운터를 늘리면 한 단계에서 증가 된 값을 얻습니다. 비교 : (A)이 작업을 두 단계로 수행하고 다른 사람 (B)가 단계 사이에서 동일한 작업을 수행하는 경우 A와 B는 서로 다른 두 가지 대신 동일한 마지막 카운터 값을 얻을 수 있습니다 (가능한 문제의 한 예).


0

카운터 연산 (inc 또는 dec)에 대해 findAndModify ()를 사용했으며 다른 단일 필드는 케이스를 변경했습니다. 우리의 응용 프로그램을 Couchbase에서 MongoDB로 마이그레이션 하면서이 API는 GetAndlock ()을 수행하는 코드를 바꾸고, 로컬로 내용을 수정하고, replace ()를 저장하고 Get ()을 다시 업데이트하여 업데이트 된 문서를 다시 가져 오는 것으로 나타났습니다. mongoDB에서는 방금 업데이트 된 문서를 반환하는이 단일 API를 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.