2014-04-01 5 views
0

MongoDB에는 두 개의 컬렉션이 있습니다. 하나는 게재 위치이고 다른 하나는 tids입니다.mongo db는 컬렉션 쿼리를 교차합니다.

게재 위치 컬렉션에는 program_id, placement_id, tids 컬렉션에는 placement_id 및 tid_id가 있습니다.

select tids.tid_id 
from tids 
inner join placements 
where tids.placement_id = placements.placement_id 
and placements.program_id = 3 or 5 

그것은 MongoDB를은 '아무튼 말한다 :

가 나는 것 SQL에서, 그래서 3,5로 program_id 모든 게재 위치를 찾은 다음 그 PLACEMENT_ID와 TIDS 컬렉션에서 모든 tid_id를 찾을 수 원하는 조인을 지원하므로 이와 같은 쿼리를 수행 할 수 있습니까?

+1

은 mongodb에서 두 번, 하나는 게재 위치에, 하나는 tids에 쿼리해야합니다. – huocp

+0

컬렉션 수준에서만 쿼리 할 수 ​​있습니다. 데이터에 따라 더 작은 컬렉션을 메모리에로드 한 다음 원하는 코딩 언어로 쿼리를 시작하는 것이 더 쉽습니다. – Matt

+0

문제가 두 컬렉션에 수백만 개의 레코드가 있습니다. mongoDB 자바 클라이언트를 사용합니다. mongdb 쿼리를 위임 할 수 있다면 루프를 사용하는 것이 실제로 느리고 메모리가 많이 소모됩니다. – user468587

답변

0

불행히도 나는 어떤 마법도 제공 할 수 없다.

1) "수백만 개의 레코드 및 느린 루프"에 대한 메모에서 인덱스를 사용할 수 있지만 속도가 느려서는 안됩니다. (a) 게재 위치 모음 - program_id의 인덱스를 입력하면 그것으로 쉽게 검색 할 수 있습니다. (b) 해당 게재 위치를 추출한 후 해당 placementIds의 java 목록을 만듭니다. (c) tids collecton - placementIds의 인덱스를 입력하고 $ in 쿼리를 실행합니다 (위의 placementIds가 추가로)

2) 또는, 위의 Asya Kamsky의 의견을 mongo에서 데이터를 비정규 화/집계하는 일반적인 관행으로 고려하십시오. 경우는 1 : 많은 (많은하지 : 많은)보다는 아마 배치와 같은 집계 '배치'문서 : { ID : .. 데이터 ... TIDS : [ {TID (1 개) 정보를 원하시면 ...}, { tid 2 info ...}, ] } .주의 : 비정규 화 된 데이터는 유지하기 어려울 수도 있지만 mongo 및 디자인 패턴에 대한 주요 비판 중 하나이지만 신중하게 고려해야합니다.

0

Mongo에서 언급 한 것처럼 조인을 할 수 없기 때문에 결과를 단일 쿼리로 얻을 수 없습니다. 쿼리는 단일 컬렉션에서만 실행됩니다. 유일한 방법은 컬렉션에서 별도로 가져 와서 코드에서 병합하는 것입니다.

관련 문제