2011-07-27 65 views
19

He creado la consulta que quiero en el shell pero estoy teniendo problemas para escribirla en Mongoose.Group (By) in Mongoose?

db.commentstreams.group({ key: { page_id: true }, reduce: function(obj,prev) { prev.num_comments += obj.num_comments }, initial: { num_comments: 0 } }) 

Estoy un poco confundido por la sintaxis de Mongoose; tal vez alguien podría arrojar algo de luz sobre este. Muchas gracias.

+1

historia de mi vida. – weisjohn

Respuesta

14

Según this post:

Model.find({}, [fields], {'group': 'FIELD'}, function(err, logs) { 
     ... 
}); 

Por desgracia, parece que falte documentación de éste.

+1

Esto no parece funcionar: devuelve todo el documento como haciendo un descubrimiento vacío. –

+1

$ grupo en lugar de grupo? –

13

MapReduce debe ser el camino correcto, pero si no está fragmentando y su consulta no dará como resultado más de 10k registros, está bien.

Se puede acceder a todas las funciones de nodo-mongodb nativo a través Moongoose, por lo que se ve así:

var group = { 
    key: {}, 
    cond: {item_id: item_id}, 
    reduce: function(doc, out) { 
     out.count++; 
     out.total += doc.value; 
    }, 
    initial: { 
     total: 0, 
     count: 0 
    }, 
    finalize: function(out) { 
     out.avg = out.total/out.count; 
    } 
}; 

Item.collection.group(group.key, group.cond, group.initial, group.reduce, group.finalize, true, function(err, results) { 
    console.log('group results %j', results); 
}); 

nodo-mongodb nativo fuente: https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js#L1165

MongoDB grupo doc: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group