2011-09-08 26 views
5

Tôi muốn cung cấp một điều kiện cho nhóm của tôi trong Mongoid, nhưng làm thế nào tôi có thể gửi nhiều giá trị cho một thuộc tính trong điều kiện băm? Đây là những gì tôi muốn làm:Mongoid `nhóm()` điều kiện

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

Vì vậy, do đó bất kỳ PageView với một trong hai page_id sẽ ngoài của truy vấn, nhưng tôi dường như không thể có được băm điều kiện (cond) để làm việc ở tất cả! Tôi đang làm gì sai ở đây, tôi thực sự bối rối.

Dưới đây là các tài liệu API cho các phương pháp group(): http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.


cập nhật

Chạy truy vấn như vậy:

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

Trả về lỗi sau, nhưng cú pháp có vẻ tốt đẹp với tôi:

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>' 

Đó là bực bội mà không có ví dụ nào ở đây, các tài liệu nói rằng t ông tham số điều kiện là như vậy:

(String, BSON::Code) :cond — default: {} — A document specifying a query for filtering the documents over which the aggregation is run (optional).

Vì vậy, nếu phải mất một String hoặc BSON::Code, điều gì sẽ này như thế nào?

Trả lời

4

Bạn cần sử dụng $in để truy vấn đối sánh với nhiều giá trị. Vì vậy, nó sẽ được viết như

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

Bạn có thể đọc thêm về nó ở đây: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

+0

Hmm, dường như để cho tôi một lỗi cú pháp: '(IRB): 158: lỗi cú pháp, bất ngờ '}', mong $ $ ... ',' 4e6912618083ab383e000009 ']}}, ... ' –

+0

Bạn đã đặt dấu ngoặc mở giữa' page_id: 'và' $ in'? – Russell

+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ, tôi đã cập nhật câu hỏi của mình với những gì xảy ra. –

Các vấn đề liên quan