2012-07-30 13 views
0

Ruby에 작은 토런트 인덱서를 쓰고 있습니다 (here). MongoDB를 데이터베이스 옵션으로 지원하고 싶습니다. 현재 데이터베이스는 tagtorrent 사이의 다 대다 관계로 설정되어 있습니다.mongodb의 many to many 관계

torrent_id 전체를 주어진 목록의 모든 태그와 일치하는지도 테이블에서 가져 오는 쿼리의 형식을 어떻게 지정합니까?

나는 다음과 같이 SQL에서 이런 짓을 :

select torrent_id, count(*) num from tagmap where tag_id in (tag1, tag2, tag3, tag4) group by torrent_id having num = 4"

편집 : 나는 지금 torrent_idtag_id으로 수집 만하고 있어요. 그게 전부입니다. 그래서 id를 id에 매핑하고 더 많이 제외 시켰습니다.

+0

를 사용해야합니다 (그룹화, 계산). –

+0

각각의 장점은 무엇입니까? – tekknolagi

+0

가입 콜렉션이있는 경우 태그와 토런트 레코드를 연결하려면 여러 쿼리를 수행해야합니다. 예를 들어 배열의 레코드에 태그가 직접있는 경우 단일 쿼리에서 특정 태그가있는 급류를 검색 할 수 있습니다. –

답변

1

tag_id 및 torrent_id로 구성된 매핑을 만들려면 컬렉션을 만드는 것이 좋습니다. 토렌트를 추가 할 때마다 토렌트 태그를 토렌트 태그 컬렉션에 추가하십시오. 색인은 tag_id에 있어야합니다.

다음 쿼리 구문을 사용하면 두 개 이상의 태그와 일치하는 급류 목록을 얻을 수 있습니다.

db.tagmap.find({tag_id:{$in: ['tag1','tag2','tag3','tag4']}});

Aggregation 위해 당신은 당신이 가입 수집을 갖는 당신의 토런트 수집에 직접 태그를 넣어하지 고려해야 맵리 듀스

+0

내 편집을 참조하십시오. – tekknolagi

+0

정말 고마워요! 이게 작동하는지 알려 드리겠습니다. :) – tekknolagi

+0

아, 루비 문법과 같은가요? '$ map.find (: tag => {: $ in => [ 'tag1', 'tag2']})')로 작동할까요? – tekknolagi