2016-06-29 5 views
1

많은 요청을 트리거하는 프로세스가있어서 여러 개의 웹 훅을 트리거합니다. 나는 모든 webhook을 받았을 때 그 과정이 완료되었다는 것을 안다. 내 모델은 이런 모습입니다.몽구스와 함께 "인종"상태입니다.

{ 
    name: 'name', 
    status: 'PENDING', 
    children: [{ 
     name: 'child1', 
     status: 'PENDING' 
    }, { 
     name: 'child2', 
     status: 'PENDING' 
    }] 

} 

아이디어는 webhooks가에 와서, 내가 COMPLETE에 subdoc을 업데이트합니다. 각 업데이트가 끝날 때 다른 것들이 완료되었는지 확인하고 만약 그렇다면 부모에 status='COMPLETE'을 설정합니다. 다른 호출이 여전히 PENDING이지만 그 두 번째 호출이 저장되기 전에 확인한 후에 서비스 호출 중 하나를 COMPLETE으로 표시하는 것처럼 보입니다. 두 번째 저장하면 부모에 PENDINGCOMPLETE 덮어 씁니다. 내가 방금 수정하고 전체 문서마다 덮어 쓰기/자녀가 대신 절약의 객체를 저장할 때이 문제를 해결할 수 있다고 생각

methods: { 
    doUpdate: function(data) { 
     var child = this.children.id(data.childId); 
     child.status = 'COMPLETE'; 
     if (_.every(this.children.status, 'COMPLETE')) 
      this.status = 'COMPLETE'; 
     return this.save(); 
    } 
} 

답변

0

해결책은 mongo의 변형 인 findAndModify 방법을 사용하여 한 번에 상태를 찾아 업데이트 한 다음 다른 자식이 완료되었는지 확인하는 것입니다. 한 번의 작업으로 두 번의 업데이트를 수행하려고했습니다. 두 단계로 나눠서 다른 자식의 상태를 확인할 때 다른 모든 호출은 문서의 가장 최근 상태를 가지며 다른 호출은 save()이 완료되기를 기다리는 동안 잘못된 판독을 얻지 못한다는 것을 알고 있습니다.

1

: 여기

내 스키마에서 코드입니다.
업데이트 문에 positional $을 사용할 수 있습니다.
기본적으로는 다음과 같이 보일 것입니다 :

db.yourChildrenCollection.update(
    { _id: this._id, 'children.name': childName }, 
    { $set: { 'children.$.status' : 'COMPLETE' } } 
) 

당신은 내가 당신의 컬렉션 이름 등을 알고하지 않는 변수 이름을 수정해야하지만 난 당신이 포인트를 얻을 생각합니다.

관련 문제