2012-04-21 6 views
1

Я знаю, что это возможно с уменьшением карты (reference), но мне было интересно, можно ли использовать группу (в частности, в функции keyf), чтобы объединить две коллекции.Группа Mongodb, соединяющая две коллекции

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 Driver, но это не очень важно, так как запрос (практически) необработанный.

ответ

0

Невозможно объединить две коллекции, используя функцию «группа». Групповая функция предназначена для агрегации, выражение запроса cond используется для выбора документов, ключевое выражение или функция keyf обеспечивает группировку, начальное выражение и функцию уменьшения функции, а функция finalize позволяет обрабатывать каждый элемент в результат агрегации.

Обратите внимание, что функция группировки «группа» предназначена для одной коллекции, то есть все данные взяты из одной коллекции. В ссылке на сокращение карты эквивалент объединения является результатом сопоставления двух коллекций с общими ключами и общей выходной коллекцией при запуске функции уменьшения в выходной коллекции.

Вы можете сами убедиться, что функция поиска не определена в контексте запуска групповой функции на сервере с помощью оболочки mongo для запуска следующего.

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 } ] 
Смежные вопросы