2

mongoDB初心者です。書籍と著者の 2 つのコレクションがあります。[名前と作品]はそれぞれ共通の欄です。内部結合を使用して、Book と Author のいくつかの列を出力する必要があります。次の SQL クエリのように:

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 でこれと同じクエリを実行する必要があります。マップ/リデュース?

4

5 に答える 5

2

mapreduce関数を使用してそれを行う方法が必要です。

このdbオブジェクトはMRで長い間非推奨になっているため、MR内で2つのテーブルを同時に調達することはできません。

ただし、別の解決策があります。2つのMRです。最初に必要なコレクションに出力する最初のコレクションでMRを実行し、次に2番目のMRを使用して、2つのコレクションに「参加」するなどのoutオプションを使用して、まったく同じコレクションに出力します。reducemerge

もちろん、これは遅いので、それをしない方が良い方法です。はどうかと言うと:

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

このクエリは、本のコレクションからカーソルをストリーミングし、反復する各本を非常にすばやくDBに固定して(MongoDBでこれを実行してもかまいません)、著者の詳細を取得することで実行できます。

また、書籍から著者IDのセットを取得し、著者コレクションを一度にクエリして、クライアント側で2つを分類することもできます。

于 2012-09-25T13:48:46.957 に答える
2

MongoDB は JOIN 操作をサポートしていません。この機能が必要な場合は、両方のコレクションを照会して自分で実装する必要があります。

そのため、多くの場合、リンクではなく埋め込みを使用することをお勧めします。

通常、Map/Reduce ジョブは非常にコストのかかる操作です。これは、データ マイニングの目的でたまにしか使用しないでください。

于 2012-09-24T11:39:45.833 に答える
1

mongodb はリレーショナル データベースではないため、ここではどのような種類の結合もできません。結合はスケーリングが困難です。

結合を実現するための mongodb の一般的な方法は、データの非正規化です。あなたの場合、著者名を本のテーブルに非正規化できます。その後、クエリは結合を必要としません。これはスキーマの例です:

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

author_nameauthor コレクションを更新するたびに、books コレクションを更新する必要があることに注意してください。

別の解決策 - 各書籍の著者名を追加でリクエストしますが、動作がかなり遅くなります。

于 2012-09-24T11:40:38.563 に答える