Как использовать MongoDB Ruby Driver для создания «группы» (group by)? - PullRequest
4 голосов
/ 16 сентября 2010

относится к MongoDB Group с использованием драйвера Ruby

, если я хочу сделать что-то подобное в SQL:

select page_id, count(page_id) from a_table group by page_id

Я думал, что документ MongoDB говорит

http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

group(key, condition, initial, reduce, finalize = nil)
# returns an array

Итак, из другого поста я использую:

Analytic.collection.group(  "fucntion (x) return {page_id : x.page_id}", 
                            nil, 
                            {:count => 0},  
                            "function(x, y) { y.count++ }"  )

, но на самом деле возвращается

[{"count"=>47.0}] 

, которыйобщее количество записей (документов) в коллекции.Что-то не так?Я подумал, что ключ может быть статической строкой, как в

http://kylebanker.com/blog/2009/11/mongodb-count-group/

db.pageviews.group(
{
 key: {'user.agent': true}, 
 initial: {sum: 0}, 
 reduce: function(doc, prev) { prev.sum += 1}
});

, но его нет в другом сообщении stackoverflow.

Обновление: на самом деле, по ссылке выше, решение, подобное

Analytic.collection.group(  ['page_id'], nil, 
  {:count => 0},  "function(x, y) { y.count++ }"  )

, работает, но просто удивляйтесь, почему первый метод в этом посте не сработал.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2010

Причина, по которой первый пример не сработал, заключается в том, что вы неправильно написали "function" как "fucntion".Должно работать следующее:

Analytic.collection.group( "function(x){ return {page_id : x.page_id}; }", 
                           nil, 
                           { :count => 0 },  
                           "function(x, y){ y.count++; }" )
2 голосов
/ 25 сентября 2010

Я наконец-то заставил его работать

Analytic.collection.group(  ['myapp_id'], {:page => 'products'}, 
  {:pageviews => 0, :timeOnPage => 0},  
  "function(x, y) { y.pageviews += x.pageviews;  y.timeOnPage += x.timeOnPage }"  )

, но потом я использовал Map / Reduce, так как Map / Reduce кажется более общим и мощным методом.

...