2012-09-14 4 views
1

몽고 데이터베이스에 두 개의 콜렉션이 있다고 가정하십시오 : A & B. 각 A 문서는 B에 대한 참조를 가질 수 있지만 B 문서는 A에 대한 참조를 다시 갖지 않습니다.Mongo : 다른 콜렉션에서 참조되지 않은 문서를 가져 오는 중

어떻게 효율적으로 B것을이 A에서 문서에 의해를 참조되지 않는 모든 문서를 찾을 수 있습니까?

B에있는 모든 문서를 검색하고 수동으로 A 문서와 비교하는 것보다 효과적인 방법이 있습니까? 맵 축소로이 작업을 수행 할 수 있습니까?

쿼리를 지원하기 위해 B에서 A에 대한 참조를 추가해야합니까? Mongo는 트랜잭션을 지원하지 않으므로 실패 할 경우 일관성없는 상태가 될 수있는 가능성을 피하기 위해 모든 양방향 참조를 피했습니다.

또한 이러한 결과가 솔루션에 영향을 미치는 경우 효과적으로 페이지를 넘길 수 있어야합니다. 의사 코드에서

답변

1

:

// Get the set of B document ids that are referenced by A documents. 
var bref_ids = db.A.distinct('b_id'); 

// Get the set of all other B documents. 
var unreferenced_b_docs = db.B.find({_id: {$nin: bref_ids}}); 
+0

감사합니다, 조니. 좀 더 효율적인 방법이 있기를 바랬지 만, 나는'B'에서'A'로 되돌아 가야한다고 생각하기 시작했습니다. 쿼리는 간단하지만 데이터베이스를 업데이트하는 동안 오류가 발생하여 데이터베이스의 불일치를 해결할 수있는 논리를 추가해야합니다. – HolySamosa

+0

나는 가능하다면 역 참조를 피할 것입니다. 불일치에 대한 기회가 너무 많습니다. 'A' 컬렉션의 'b_id' 속성에 인덱스를 추가하면 성능은 괜찮습니다. 분명히 상황의 특성에 달려 있습니다. – JohnnyHK

+0

경고 - 이것은 확장되지 않습니다. 'distinct'연산은 최대 데이터 크기가 16MB로 제한됩니다. –

관련 문제