2017-09-24 1 views
0

API 호출이 두 개의 개별 콜렉션을 업데이트해야하는 경우가 있습니다. 하나의 업데이트가 실패하면 첫 번째 업데이트를 되돌려 야합니다. 두 작업 중 하나가 성공적으로 완료되었는지 또는 전혀 완료되지 않았는지 확인하려면 어떻게합니까? 명확히하기 위해 여기 상황이 있습니다. 익스프레스 프레임 워크에서 MongoJS 사용하기.MongoDB 다중 콜렉션 업데이트

질문 모델

{ 
    _id: ObjectId(), 
    title: String, 
    description: String, 
    accepted: String, 
    // Some other fields 
} 

대답 모델

{ 
    _id: ObjectId(), 
    qid: String, //ObjectId of question its linked to 
    body: String, 
    accepted: boolean, 
    // Some other fields 
} 

접근 1 : 먼저 요청에서 전송 id에 해당하는 답을 당깁니다. 수락 된 것으로 표시하고 qid을받습니다. qid에 해당하는 질문 문서에 answer id을 삽입하십시오. 두 번째 작업이 실패하면 첫 번째 작업으로 되돌립니다. 그러나 db 연결이 끊어지면 수행 할 수 없습니다.

접근법 2 먼저 qid에 해당하는 질문을 받으십시오. accepted 필드를 answer id으로 업데이트 한 다음 이에 해당하는 답변을 받아 승인 된 것으로 표시하십시오.

그렇다면 한 가지 대답을 수락하면 다른 모든 대답을 수락하지 말아야합니다. 그것은 세 번째로입니다. 게다가 그것은 토글 연산이기 때문에 이미 받아 들여 졌다면 그 반대를 할 필요가있다.

이 상황을 처리하기위한 더 깨끗하고 안전한 방법이 있다는 느낌이 들었습니다.

답변

0

MongoDB does not have a way of doing multi-document transactions. 그래서 이런 롤백 방식은 없습니다. 응용 프로그램에 구현되어야합니다. MongoDB 문서는 two-phase commit 패턴을 사용하여 트랜잭션과 유사한 의미를 만들 것을 제안합니다. 이 방법을 사용하여 롤백을 구현할 수 있지만 이는 매우 번거로울 수 있습니다.

다른 대안은 문서 스키마를 다시 생각하는 것입니다. answer 개의 문서를 question 문서에 삽입 할 수 있습니까? 임베디드 문서를 사용하면 트랜잭션을 구현하는 것보다 Mongo의 기능을 더 잘 사용할 수 있습니다. MongoDB는 단일 문서에 대해 원자 적 쓰기를하므로 임베디드 문서를 업데이트하는 중에 오류가 발생하면 전체 작업을 롤백 할 수 있습니다.

+0

임베딩에 문제가 있습니다. 그것은 연속적으로 답장을 줄 것입니다. 회신에 대한 업데이트를 수행하는 것은 불가능 해집니다. – Nil

+0

음 ... 답변 및 질문과 같이 답변 및 질문/답변을 동시에 업데이트 하시겠습니까? 그렇지 않다면, 아마도 별도의 콜렉션에 응답을 가지고 있고 단지 응답의'_id' 배열을 가지고있을 수 있습니까? – tfogo

관련 문제