-1

私は MongoDB を初めて使用し、MapReduce を初めて使用します。

次のスキーマを持つ Shops と Products の 2 つのコレクションがあります。

Products
{'_id', 'type': 'first', 'enabled': 1, 'shop': $SHOP_ID  }
{'_id', 'type': 'second', 'enabled': 0, 'shop': $SHOP_ID  }
{'_id', 'type': 'second', 'enabled': 1, 'shop': $SHOP_ID  }

Shops
{'_id', 'name':'L', ... }
{'_id', 'name':'M', ... }

「有効」=> 1 の製品を持つ「L」という名前のショップを取得するために、MapReduce を使用した MongoDB の GROUPBY 同様のステートメントを探しています。

どうすればいいですか?ありがとうございました。

4

2 に答える 2

1

Map Reduce 操作を行わなくても、必要な情報を取得できるはずです。

まず、{'enabled': 1} に一致するドキュメントの「Products」コレクションをクエリし、そのクエリから $SHOP_IDs のリストを取得します (これは、「Shops」コレクションの _id 値に対応すると思います)。それらを配列に入れて、「Shops」コレクションに対して $in クエリを実行し、「name」に対するクエリと組み合わせます。

たとえば、次の 2 つのコレクションがあるとします。

> db.products.find()
{ "_id" : 1, "type" : "first", "enabled" : 1, "shop" : 3 }
{ "_id" : 2, "type" : "second", "enabled" : 0, "shop" : 4 }
{ "_id" : 3, "type" : "second", "enabled" : 1, "shop" : 5 }
> db.shops.find()
{ "_id" : 3, "name" : "L" }
{ "_id" : 4, "name" : "L" }
{ "_id" : 5, "name" : "M" }
> 

最初に {"enabled" : 1} に一致するすべてのドキュメントを検索します

> db.products.find({"enabled" : 1})
{ "_id" : 1, "type" : "first", "enabled" : 1, "shop" : 3 }
{ "_id" : 3, "type" : "second", "enabled" : 1, "shop" : 5 }

上記のクエリから、_ids のリストを生成します。

> var c = db.products.find({"enabled" : 1})
> shop_ids = []
[ ]
> c.forEach(function(doc){shop_ids.push(doc.shop)})
> shop_ids
[ 3, 5 ]

最後に、shop_ids 配列内の _id 値が {name:"L"} にも一致するドキュメントについて、shops コレクションをクエリします。

> db.shops.find({_id:{$in:shop_ids}, name:"L"})
{ "_id" : 3, "name" : "L" }
> 

Mongo と同等の結合操作を行うことに関して、同様の質問が以前に寄せられました。この質問には、追加のガイダンスを提供する可能性のあるリンクがいくつか含まれています:
How to join MongoDB collections in Python?

Map Reduce を試してみたい場合は、インクリメンタルな Map Reduce 操作を使用して 2 つのコレクションの値を結合したユーザーのブログ投稿へのリンクを次に示します。
http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

上記により、コレクションから目的の情報を取得できることを願っています。

于 2012-04-23T22:33:07.677 に答える
0

簡単な答え: それはできません (単一の MapReduce コマンドでは)。

長い回答: MongoDB の MapReduce ジョブは単一のコレクションでのみ実行され、プロセス内の他のコレクションを参照することはできません。そのため、SQL のJOIN/のような動作はここでは利用できません。GROUP BY新しい集約フレームワークも、単一のコレクションのみで動作します。

私は2つの部分からなる解決策を提案します:

  1. 名前が「L」のすべてのショップを取得します。

  2. この事前に計算されたショップのリストに対してすべての製品ドキュメントをチェックする map-reduce コマンドを作成して実行します。

于 2012-04-18T20:34:06.190 に答える