2011-09-08 3 views
5

Je souhaite fournir une condition pour mon regroupement dans Mongoid, mais comment puis-je envoyer plusieurs valeurs pour un attribut dans le hash des conditions? Voilà ce que je veux faire:Mongoid `conditions group()`

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

Ainsi donc toute PageView avec l'une ou l'autre page_id sera en dehors de la requête, mais je ne peux pas sembler se rendre au travail à tout le hachage de condition (cond)! Qu'est-ce que je fais mal ici, je suis vraiment confus.

Voici les API docs pour la méthode group(): http://api.mongodb.org/ruby/current/Mongo/Collection.html#group-instance_method

Toute aide serait grandement appréciée.


mise à jour

L'exécution de la requête en tant que tel:

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

Renvoie l'erreur suivante, mais la syntaxe semble bien pour moi:

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

Il est frustrant que il n'y a pas d'exemples de cela partout, les docs disent que t il paramètre condition est en tant que tel:

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

Donc, s'il faut un String ou BSON::Code, qu'est-ce que cela ressemblerait-il?

Répondre

4

Vous devez utiliser $in pour que la requête corresponde à plusieurs valeurs. Donc, il serait écrit

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

Vous pouvez en lire davantage ici: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

+0

Hmm, me semble donner une erreur de syntaxe: '(RIR): 158: erreur de syntaxe, unexpected '}', attendre $ fin ... ',' 4e6912618083ab383e000009 ']}}, ... ' –

+0

Avez-vous placé le crochet d'ouverture entre' page_id: 'et' $ in'? – Russell

+0

Merci beaucoup pour votre aide, j'ai mis à jour ma question avec ce qui se passe. –