2013-04-26 4 views
2

1 억 개의 문서가있는 모음집이 있습니다. 안전하게 문서의 번호를 업데이 트하고 싶습니다 (안전하게 업데이 트되지 않은 경우에만 문서를 업데이 트하여 의미). 몽고에서 효율적인 방법이 있습니까?몽고 (Mongodb) 업데이트 문서 수 제한

제한 절과 함께 $ isolated 연산자를 사용할 계획 이었지만 mongo는 업데이트 제한을 지원하지 않습니다.

이것은 간단 해 보이지만 나는 막혀 있습니다. 어떤 도움을 주시면 감사하겠습니다.

+1

흠, 내가 두려워하는 JIRA 링크를 제공하는 것보다 더 이상 당신을 영사 할 수 없습니다 : https://jira.mongodb.org/browse/SERVER-1599 – Sammaye

+0

고마워요. 나는이 문제에 대해 투표하기로 등록했다 :-)이 기능이 구현 될 때까지 복잡한 회피책을 찾아야한다. ... – jckdnk111

+0

"안전하게"- 제한이 이것과 관련된 이유는 명확하지 않다. 문서를 사용하고 "{multi : true}"를 사용하면 각 문서가 한 번만 업데이트됩니다. 정확한 사용 사례를 설명해 주시겠습니까? 해결 방법이있을 수 있습니다. –

답변

1

Sammaye 당, 이것을 수행하는 "적절한"방법이없는 것처럼 보입니다. 내 해결 방법은 sequence as outlined on the mongo site을 만들고 컬렉션의 모든 레코드에 'seq'필드를 추가하기 만하면됩니다. 이제는 안정적으로 정렬 할 수있는 고유 한 필드가 있습니다.

신뢰할 수있는 정렬이 중요합니다. 나는 자동 생성 된 _id를 정렬하려고했으나 자연 순서가 ObjectId의 오름차순과 같지 않음을 깨달았다. (문자열 this page에서 볼 때 문자열 값이 내가 관찰 한 동작과 일치하는 개체 값보다 우선시되는 것처럼 보입니다. 테스트). 또한 디스크에 레코드를 재배치하여 자연 순서를 정렬에 신뢰할 수 없도록 만드는 것이 전적으로 가능합니다.

이제는 포함 된 시작점을 얻기 위해 아직 업데이트되지 않은 가장 작은 'seq'로 레코드를 쿼리 할 수 ​​있습니다. 다음으로 'seq'가 시작점보다 큰 레코드를 쿼리하고 건너 뛸 수 있습니다 (문서를 제거하면 'seq'가 희박해질 수 있으므로 건너 뛰는 것이 중요합니다 ...). 업데이트 할 레코드 수입니다. 해당 쿼리에 1을 입력하면 비 포괄적 종점이 생깁니다. 이제 'updated'= 0, 'seq'> = 시작 지점과 < 내 끝점을 사용하여 업데이트를 발행 할 수 있습니다. 다른 스레드가 펀치에 나를 이길 수 없다고 가정하면 업데이트를 통해 원하는 것을 얻을 수 있습니다. 여기

단계는 다시 다음과 같습니다

  1. 적당한 시작점을 찾기 위해 자동 증가 순서를
  2. 쿼리를 사용하여 컬렉션에 필드를 추가
  3. findAndModify
  4. 를 사용하여 자동 증가 시퀀스를 생성 적절한 종점을 찾기 위해 쿼리 : db.xx.find ({seq : {$ gt : startSeq}}). sort ({seq : 1}). 건너 뛰기 (updateCount). 제한 (1)
  5. 시작 및 끝 점을 사용하여 콜렉션을 업데이트하십시오. db.xx.update ({updated : 0, seq : {$ gte : startSeq}, seq : {$ lt : endSeq}, $ isolated : 1}, {updated : 1 }, {multi : true})

꽤 고통 스럽지만 일이 끝납니다.