2012-09-24 5 views
1

mongoDB의 초보자입니다. 나는 두 권의 책과 저자를 가지고있다. [name and workswritten]은 각각 공통 열입니다. 내부 사용이 SQL 쿼리처럼 ...... 나는 책과 저자의 일부 열을 방출해야 가입 :MongoDB에서 두 개의 컬렉션을 결합하십시오.

select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written 

내가 MongoDB의에서이 같은 쿼리를 할 필요가있다. 지도/축소?

+0

내가이 – Rudra

+0

가능한 복제와 같은 조인 스크립트를 [? 어떻게 내가 SQL은 MongoDB의 동등한 참여 수행 함] 한 (http://stackoverflow.com/questions/2350495/how-do-i-perform-the-mongodb-SQL-join) – sidgate

답변

2

MongoDB는 JOIN 작업을 지원하지 않습니다. 이 기능이 필요할 때 두 컬렉션을 모두 쿼리하여 직접 구현해야합니다.

그런 이유로 링크 대신 삽입을 사용하는 것이 좋습니다.

지도/축소 작업은 대개 매우 비용이 많이 드는 작업입니다. 데이터 마이닝 용도로만 가끔 사용해야합니다.

+0

mapreduce 함수를 사용하여 수행하는 방법이 필요합니다. – Rudra

1

mongodb는 관계형 데이터베이스가 아니므로 여기서는 어떤 종류의 조인도 가능하지 않습니다. 조인은 확장하기가 어렵습니다.

mongodb에서 조인을 얻는 일반적인 방법은 데이터 비정규 화입니다. 귀하의 경우에는 저자 이름을 책 테이블로 비정규화할 수 있습니다. 그러면 쿼리에 조인이 필요하지 않습니다.

book 
{ 
    _id, 
    name, 
    editions, 
    characters, 
    author_name 
} 

당신이 저자의 수집을 업데이트 할 때 당신이 책 컬렉션마다 author_name를 업데이트해야하는 유의 사항 :이 스키마 예입니다.

다른 해결책 - 각 도서의 작성자 이름에 대한 추가 요청이 있지만 훨씬 느려질 것입니다.

+0

mapreduce 함수를 사용하여 수행하는 방법이 필요합니다. – Rudra

+0

@ Rudra : 두 개의 콜렉션에서 m/r을 실행할 수 없습니다. 다시 한 번 - mongodb는 모든 종류의 조인을 지원하지 않습니다. 가능한 모든 솔루션을 제 대답에 나열했습니다. 가입이 필요하다면 SQL 데이터베이스를 사용하십시오. mongodb에서는 하나의 컬렉션에서만 필요한 모든 것을 연주하고 할 수 있습니다. –

2

mapreduce 기능을 사용하여 수행하는 방법이 필요합니다.

db 개체는 MR에서 오랫동안 사용되지 않으므로 MR에서 한 번에 두 테이블을 제공 할 수 없습니다.

다른 해결책이 있습니다. 두 명의 MR이 있습니다. 먼저 필요한 컬렉션으로 출력 한 첫 번째 컬렉션에서 MR을 실행 한 다음 reduce 또는 merge과 같은 out 옵션을 사용하여 두 번째 MR을 함께 사용하여 두 개의 컬렉션에 "조인"하는 두 번째 MR을 출력합니다.

물론 이것은 느리기 때문에 더 좋은 방법은하지 않는 것입니다. 에 관해서는 :

select book.name,book.editions,book.characters,author.name 
from dbo.book book 
inner join dbo.author author on book.name=author.works_written 

이 쿼리는 책 모음에서 커서를 스트리밍하고 매우 빠르게 (가 MongoDB의에서이 작업을 수행 괜찮은지)을 반복 각 책을 DB를 갈망 저자의 세부 사항을 잡는 함께 할 수 있습니다.

또한 책에서 저자 ID 집합을 가져온 다음 authors 컬렉션을 한 번에 쿼리하고 클라이언트 측에서 두 ID를 정렬 할 수 있습니다.

1

이 시도 : -

db.book.aggregate([ 
    { 
     $lookup: 
     { 
      from: "author", 
      localField: "name", 
      foreignField: "works_written", 
      as: "nameWorkData" 
     } 
    } 
]) 
관련 문제