1

map reduce (参照) で可能であることは知っていますが、グループ (具体的にはkeyf関数内) を使用して 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 ドライバーを使用していますが、クエリは (実質的に) 生であるため、それほど重要ではありません。

4

1 に答える 1

0

「グループ」機能を使用して 2 つのコレクションを結合することはできません。group 関数は集計を目的としており、cond クエリ式はドキュメントの選択に使用され、key 式または keyf 関数はグループ化を提供し、initial 式と 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 } ]
于 2012-04-23T19:00:42.880 に答える