2013-10-30 2 views
0

파이썬에서 MongoEngine을 사용하여 데이터 모델을 사용하고 있습니다.문서 내의 목록에있는 하위 문서 내의 목록에 추가?

{ 
    'id': ... 
    'revisions': [ 
     { 
      'id': ... 
      'revision': 1, 
      'derivatives': [ 
       { 
        'id': ... 
        'name': 'Derivative 1' 
       } 
      ] 
     } 
    ] 
} 

우리는, owner.revisions의 모든 하위 문서가 revision을 호출됩니다, 가장 바깥 쪽 문서화 owner 전화 할게 모든 하위 문서 revision.derivatives을에서 :

나는 BSON 표현으로 기본적으로 다음과 같습니다 데이터 모델이 derivative이라고합니다.

$addToSet을 보내고 owner의 특정 revision 안에 설정했습니다. 내가 파이썬이 작성했다 경우는 다음과 같이 것 : 나는 이러한 종류의 쿼리를 실행할 수있는 방법

def add_to_set(owner_id, revision_id, new_derivative): 
    for owner in owner_collection: 
     if owner.id == owner_id: 
      # found the right owner 
      for revision in owner.revisions: 
       if revision.id == revision_id: 
        # we've found the right revision in the right owner 
        # now append and get out 
        revision.derivatives.append(new_derivative) 
        return 

을 오른쪽 owner의 내부 권리 revision를 선택하고 원자의 내부 derivatives 컬렉션에 추가 그 revision?

이와 같은 업데이트 쿼리를 시작하는 방법을 파악하는 데 어려움이 있습니다.

답변

0

문제는 개체의 이전 버전을 기반으로 한 저장 사용입니다. 스레드로부터 안전하지 않습니다.

_id를 사용하여 개체를 전체 새 개체로 일방적으로 덮어 쓰지 않고 일치 조건을 기준으로 개체를 원자 적으로 조작하는 연산자를 사용하려고합니다. "저장"안전의

예 :

스레드 1 : 필드 {_id:1, a:1}으로 객체를 판독하는 증가, {_id:1,a:2}
스레드 2 저장 : 필드 {_id:1, a:1}으로 객체를 판독하는 증가, {_id:1,a:2}

대비 절약 이 "안전한"업데이트 :

스레드 1 : 업데이트 개체 일치 {_id:1} 연산자 사용 {$inc:{a:1}}
스레드 2 : 객체 일치 업데이트 {_id:1} 연산자 사용 {$inc:{a:1}}

두 번째 스레드에서 두 번째 스레드가 실행되는 순서에 관계없이 a의 값은 2가됩니다 (서버에서 두 번씩 증가하므로).

여러분의 개체에서 같은 일이 일어나고 있다고 생각합니다. 원하는 업데이트 작업은 $push operator입니다.

+0

실제 사례를 제공해 줄 수 있습니까? 계속 진행하는 방법을 모르겠습니다. 나는 그 질문을 갱신 할 것이다. –

+0

저는 문제가 발생하고 있음을 알고 있습니다. 솔루션을 구현하는 방법을 모르겠습니다. –

+0

당신은 save를 사용할 수 없으며 애플리케이션 측에서 일종의 잠금을 구현하지 않는 한 스레드로부터 안전 할 수 있습니다. 대안은 "저장"대신 "업데이트"사용으로 전환하는 것입니다. –

관련 문제