2012-08-30 20 views
14

MongoDB tiene un nuevo Aggregation Framework y estoy intentando descubrir cómo usarlo con Mongoid. Parece que hay una rama de ciclomotor con esta funcionalidad como se discute here. He actualizado a 2.2 y MongoDB intentado instalar esta rama del ciclomotor en mi aplicación como esta:Agregado con Mongoid

joya 'ciclomotor', git: 'git: //github.com/mongoid/moped.git', rama : 'aggregation-support'

pero la agregación sigue sin funcionar. Este es el llamado que estoy utilizando para probarlo:

= Post.all.aggregate ({ "grupo $" => { "_id" => "$ _id"}})

ACTUALIZACIÓN

En los mongo shell esto funciona:

db.users.aggregate ({grupo $: {_id: "$ _id"}})

así que estoy pensando que es un problema Mongoid ... cualquier palabra sobre esto sería genial!

+1

¿Es porque en la carcasa que está accediendo a la colección de usuarios y en Mongoid la colección de publicaciones? ^^ –

+0

¿Has probado Post.collection.aggregate ("$ group" => {"_id" => "$ _id"})? –

+0

@neon ¿Obtuvo el marco agregado para trabajar con ciclomotor y monótono utilizando esa rama y le gustaría actualizar su pregunta con la solución. – brg

Respuesta

12

En este momento, mongoid no proporciona ninguna sintaxis adicional más allá de lo que expone Moped. Si está dispuesto a incluir Moped (apuntado al maestro) en su Gemfile, puede probar el soporte de Moped para agregar.

gem 'moped', :git => 'git://github.com/mongoid/moped.git' 

Usted querrá recordar a tirar de esto una vez 1.3.0 es liberado, y acaba de actualizar a través de la vía normal de gem update moped.

Con esto en su lugar, puede ejecutar la consulta con:

Post.collection.aggregate({ "$group" => { "_id" => "$_id" } }) 

Véase el ciclomotor changelog para más información.

+0

Ya puedo hacer eso sin incluir el ciclomotor, estoy usando 5.0.0 gem of mongoid. – user1735921

27

Desde 3.0.1, Mongoid requiere MongoDB 2.2 y es compatible con el nuevo marco de agregación.

Ahora puede llamar aggregate en las colecciones:

project = {"$project" => 
    { 
    "charges" => 1, 
    "year" => { "$year" => "$created"}, "month" => { "$month" => "$created"}, 
    "week" => { "$week" => "$created"}, "day" => { "$dayOfYear" => "$created"} 
    } 
} 
group = { "$group" => 
    { "_id" => {"year"=>"$year", "week"=>"$week"}, "count" => { "$sum" => 1 } } 
} 
Charge.collection.aggregate([project,group]) 
+0

Es asombroso cómo el marco agregado carecía en primer lugar. ¿Cómo imitarías las funciones agregadas de mysql/postgresql? (pregunta retórica) – Donato

-2
db.items.aggregate(
{$match : {amount:{$gt:0},type:{$in:["Single","Double"]}}}, 
{$group:{_id:type:"$type", month:"$month", year:"$year"},Total_Price:{$sum:"$amount"}}, 
{$sort:{"_id.month": 1,"_id.year":1}}, 
{$limit:5} 
) 

Items.collection.aggregate(
{"$match"=>{:amount => {'$gt' => 0},:type=>{'$in'=>[Single","Double"]}}}, 
{"$group"=>{"_id" => {"type" => "$type", "month"=>"$month","year"=>"$year"},"Total_Price" => {"$sum"=>"$amount"}}}, 
{"$sort" => {"_id.month" => 1,"_id.year" => 1}}, 
{"$limit" => 5} 
) 

enlace de seguimiento puede ayudarle a escribir la consulta en mongodb y MongoId query