2012-04-21 7 views
1

map reduce(reference)で可能ですが、2つのコレクションを結合するには、グループ(具体的には、keyfの関数)を使用することが可能かどうかは疑問でした。Mongodbグループが2つのコレクションを結合する

MYCOLL.collection.group(:keyf => "function(doc) { var var2Item=db.mycoll2.find({\"_id\":doc.my_sub_id}); var2=var2Item.join_var; return {'myreturn': doc.var1 + var2 }; }",  
:initial => { :r => 0 }, 
:reduce => "function(doc,prev) { prev.r += +1; }", 
:cond => {(...my_conditions...)}) 

私も

var2=doc.my_sub_id.join_var  

を試してみましたし、どちらが動いていないようにみえます。私はRubyドライバを使用していますが、クエリが(実質的に)未処理であるため、実際には重要ではありません。

答えて

0

「グループ」機能を使用して2つのコレクションを結合することはできません。グループ関数は集計を目的としており、condクエリ式は文書を選択するために使用され、キー式またはkeyf関数はグループ化、初期式とreduce関数のグループ処理を提供し、finalize関数は集計結果。

集計「グループ」機能は単一のコレクション、つまりすべてのデータが単一のコレクションからのものであることに注意してください。 map-reduceリファレンスでは、出力コレクションでreduce関数を実行しているときに、2つのコレクションを共通キーと共通の出力コレクションにマッピングした結果、結合に相当するものが得られます。

mongoシェルを使用してサーバー上でグループ関数を実行するコンテキストでfind関数が未定義であることを確認することができます。

db.coll.remove(); 
db.coll.insert({a: 1, b: 2}); 
printjson(db.coll.group(
    { 
     keyf: function(doc) { return {x: db.coll.find({a: true})}; }, 
     reduce: function(doc,prev) { prev.r += 1; }, 
     initial: { r: 0 } 
    })); 

結果は次のとおりです。

[ { "x" : "DBQuery: test.coll -> undefined", "r" : 1 } ] 
関連する問題