Mongoid `group ()` условия - PullRequest
       5

Mongoid `group ()` условия

5 голосов
/ 09 сентября 2011

Я хочу предоставить условие для моей группировки в Mongoid, но как я могу отправить несколько значений для атрибута в хэше условий?Вот что я хочу сделать:

PageViews.collection.group(
  cond: {page_id: ['4e6912618083ab383e000010', '4e6912618083ab383e000009']},
  key: 'timestamp',
  initial: {count: 0},
  reduce: "function(x, y) {y.count += x.count;}"
)

Таким образом, поэтому любой PageView с page_id будет отделен от запроса, но я не могу получить хеш условия (cond) работать на всех!Что я делаю здесь не так, я действительно запутался.

Вот документация по API для метода group(): http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

Любая помощь будет принята с благодарностью.


обновление

Выполнение запроса следующим образом:

PageViews.collection.group(
  cond: {page_id: { $in : ['4e6912618083ab383e000010', '4e6912618083ab383e000009']}},
  key: 'timestamp',
  initial: {count: 0},
  reduce: "function(x, y) {y.count += x.count;}"
)

Возвращает следующую ошибку, но синтаксис мне подходит:

SyntaxError: (irb):170: syntax error, unexpected ':', expecting tASSOC
  cond: {page_id: { $in : ['4e6912618083ab383e000010',...
                         ^
(irb):170: syntax error, unexpected '}', expecting $end
...', '4e6912618083ab383e000009']}},
...                               ^
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Огорчает, что подобных примеров нигде нет, документы говорят, что параметр условия таков:

(String, BSON :: Code): cond - default: {} - Документ, задающий запрос для фильтрации документов, по которым выполняется агрегация (необязательно).

Так что если это займет String или BSON::Code, как это будет выглядеть

1 Ответ

4 голосов
/ 09 сентября 2011

Вам нужно использовать $in, чтобы запрос совпадал с несколькими значениями. Так что это будет записано как

PageViews.collection.group(
  :cond => {:page_id => { '$in' => ['4e6912618083ab383e000010', '4e6912618083ab383e000009']}},
  :key => 'timestamp',
  :initial => {count: 0},
  :reduce => "function(x, y) {y.count += x.count;}"
)    

Подробнее об этом можно прочитать здесь: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

...