2012-04-18 18 views
-1

私はMongoDBを初めて使っています。これがMapReduceの初めての使用です。MongoDB for PHPのMapReduce?

は、私は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', ... } 

私は名前のショップを検索するためのMapReduceとMongoDBのためGROUPBY同様の声明を探しています'有効' => 1の商品がある 'L'

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

+2

これらのコレクションに頻繁に参加する必要がありますか?もしそうなら、あなたはMongoDbを使って再考するか、あなたのスキーマをもう一度見直したいかもしれません。 –

+0

こんにちは、これで運がありましたか? Marcの答えはかなりよく見えますが、私は何らかのフィードバックが必要だと思います。 – halfer

+0

実際には、SQLフレンドリーなデータベースに移動しました。モンゴーは他の操作のために良いです –

答えて

0

短い答え:これはできません(単一のMapReduceコマンドを使用)。

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

私は2つの部分からソリューションを提案:

  1. は名前 "L" ですべてのお店を取得します。

  2. map-reduceコマンドを作成して、すべての製品ドキュメントをこの事前計算されたショップリストと照合します。

+0

MapReduceコマンドを手伝ってもらえますか?私は少し読んだが、私はここにそれをどのように適用するか分からない。 –

+0

「少し読んだ」よりももっと努力したいと思っています。 –

1

Map Reduce操作を行わずに、必要な情報を取得することができます。

最初に "{enabled}:1}と一致するドキュメントの" Products "コレクションをクエリし、そのクエリから$ SHOP_IDのリストを取得できます(これは"ショップ "の_id値に対応しています)コレクション)を作成し、配列に入れ、 "Shops"コレクションの$ inクエリを "name"のクエリと組み合わせて実行します。のリストを生成し、上記クエリから

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

:{1 "有効"}

> 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" } 
> 

最初に一致するすべてのドキュメントを検索:2つのコレクション所与例えば

、 _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"}にもマッチします。

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

Mongoとの結合操作に相当することに関して同様の質問がありました。ここで、あなたが削減地図を試したい場合は
How to join MongoDB collections in Python?

結合する操作を削減増分地図を使用したユーザーからのブログ記事へのリンクです:この質問は、追加のガイダンスを提供することがありますいくつかのリンクを提供します2つのコレクションからの値。
http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

希望すれば、あなたのコレクションから必要な情報を取得することができます。

関連する問題