2011-07-01 23 views
19

estoy usando mongod como base de datos con los carriles 3grupo MongoDB y clasificar

¿Cómo puedo ejecutar código similar para el siguiente código SQL en mongod. ¿Hay alguna manera de ejecutar agrupar y ordenar en mongod

select a,b,sum(c) csum from coll where active=1 group by a,b order by a 

Gracias

Respuesta

1
db.coll.group(
     {key: { a:true, b:true }, 
     cond: { active:1 }, 
     reduce: function(obj,prev) { prev.csum += obj.c; }, 
     initial: { csum: 0 } 
     }); 

se puede ejecutar en MongoDB

+5

Sólo hay grupo, donde es una especie/por fin? – Jaro

0

Hasta el Aggregation Framework es el lanzamiento en MongoDB 2.1, la llamada de grupo como en this answer, es bastante lento, ya que está utilizando la parte JavaScript del DB.

Se puede utilizar un método más rápido para contando grupos:

var res = []; 
for(var cur_a = db.coll.distinct('a'); cur_a.hasNext();) { 
    var a = cur_a.next(); 
    for(var cur_b = db.coll.distinct('b'); cur_b.hasNext();) { 
    var b = cur_b.next(); 
    res.push({ 'a': a, 'b' : b 'count': db.coll.count({'a':a,'b':b})} 
    } 
} 

que será más rápido si tiene índices en un y b

db.coll.ensureIndex({'a':1,'b':1}) 
4

me edificaba histograma y lo que hice con la versión 2.2.2 fue:

answer = db.coll.group(...) 
db.histo.insert(answer) 
db.histo.find().sort({ field: 1 }) 

En este punto, si no lo necesita, simplemente .

También puede evitar la variable y hacer:

db.histo.insert(db.coll.group(...)) 
db.histo.ensureIndex({ field: 1 }) 
10

Utilizando el marco agregada, puede hacer lo siguiente:

db.coll.aggregate({ 
    $group: { 
     _id: "$a", 
     countA: { $sum: 1}, 
     sumC:{ $sum: "$c"}, 
    }, 
    $sort:{a:1} 
}); 

Sin embargo, si usted tiene demasiados datos que puede obtener el siguiente mensaje de error:

{ 
    "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)", 
    "code" : 16389, 
    "ok" : 0 
} 

Ver más acerca de SQL a Mongo traducción aquí: http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

+0

Marius, ignore mi edición, que debe haber tenido algo más equivocado, funciona como lo ha escrito! ¡Lo siento! Trabajo – SteveO7

+3

Este doesnt más: "Un objeto de especificación de etapa de canalización debe contener exactamente un campo". – user3690202

14

inspirado en este example en el sitio web de mongo.

GENERAR DUMMY DATOS:

> db.stack.insert({a:1,b:1,c:1,active:1}) 
> db.stack.insert({a:1,b:1,c:2,active:0}) 
> db.stack.insert({a:1,b:2,c:3,active:1}) 
> db.stack.insert({a:1,b:2,c:2,active:0}) 
> db.stack.insert({a:2,b:1,c:3,active:1}) 
> db.stack.insert({a:2,b:1,c:10,active:1}) 
> db.stack.insert({a:2,b:2,c:10,active:0}) 
> db.stack.insert({a:2,b:2,c:5,active:1}) 

MONGO CONSULTA:

> db.stack.aggregate(
... {$match:{active:1}}, 
... {$group:{_id:{a:"$a", b:"$b"}, csum:{$sum:"$c"}}}, 
... {$sort:{"_id.a":1}}) 

RESULTADO:

{"result" : [ 
    {"_id" : {"a" : 1,"b" : 2},"csum" : 3}, 
    {"_id" : {"a" : 1,"b" : 1},"csum" : 1}, 
    {"_id" : {"a" : 2,"b" : 2},"csum" : 5}, 
    {"_id" : {"a" : 2,"b" : 1},"csum" : 13} 
],"ok" : 1} 

(NOTA: I reformateado la cáscara resultado un poco por lo que es más fácil de leer)

4

The mongodb agg la API de reexpedición parece haber cambiado. Ahora lo haría

db.coll.aggregate([ 
    { 
    $group: { 
     _id: "$a", 
     countA: { $sum: 1}, 
     sumC:{ $sum: "$c"}, 
    } 
    }, 
    { 
    $sort:{a:1} 
    } 
]) 

Tenga en cuenta la sintaxis de matriz para el argumento para agregar(). También agregaría elementos link $ match, $ limit, etc. como elementos de esta matriz.