2012-02-01 4 views
3

몽고 컬렉션 내에서 잠재적으로 수백만 개의 문서 사이의 필드를 비교하려고합니다. 필드는 미리 결정되며 각 필드에 가중치가 부여됩니다. 이러한 가중치는 '유사'문서에 대한 제안을 나타내는 문서 쌍을 반환하는 데 사용됩니다. 이 문서는 비교되는 경우 예를 들어, 모두 그 무게가 추가됩니다 가중치 테이블을 참조 할 것 분야 'FIRST_NAME'에 대해 동일한 값과 쌍에 대한 점수를 가지고있다. 둘 사이의 다른 필드가 같으면 점수가 업데이트되어 더 높은 유사성을 반영합니다.MongoDB 내 문서 비교

초기 결과 집합을 반복하여 결과 집합을 통과하고 각 문서를 첫 번째 반복자가있는 문서와 비교하는 (매우 비효율적 인) 반복이 포함되어 있습니다. 이것은 현재 커서를 통해 요소를 가져올 때 PHP에 의해 모두 수행됩니다.

MapReduce 구현 (실제로 적용되지 않는 것 같습니다), 커서 조작 등 거의 모든 제안을 할 수 있습니다. 현재 O (n^2) 복잡성에서 작업 중이기 때문에 프로세스를 간소화 할 수 있습니다. (글쎄, 지금까지 첫 번째 반복자가 다루었던 문서를 건너 뛸 때 조금 나아졌다.)

답변

0

방지하기 위해 당신이 참조 컬렉션 필드와 그 값을 저장보고해야 할 것입니다^2 N, 예를 들어, :이 컬렉션을 직접 조회 할 수 있습니다

{ 
    field: "firstName", 
    value: "Remon", 
    documents : [ <list with all document _ids of documents that have "field" set to "value">] 
} 

이 방법은 소스 문서 "와 같은"모든 문서를 얻을 수 있습니다. 또한 이것은 당신이 하나의 O (N) 쿼리 여러 키/값 쌍을 쿼리 할 수 ​​있습니다.

는 분명히 유일한 까다로운 것은 매우 간단합니다 (당신이 필드를 업데이트 업데이트 참조)을 보인다 처음에하지만 귀하의 경우이 참조 수집을 유지하고있다.

도움이 되었습니까?

+0

나는 이것도 꽤 비슷한 설정을 만들어 보았다 유지 될 추가 컬렉션을 만드는 피하기 위해 기대했다하지만 내가 가야 할거야 더 길처럼 찾고 있습니다. 의견을 보내 주셔서 감사합니다. – Ghjnut