Tengo una colección de documentos que se ven así:
[ { group_id: 1, value: 'foo' }, { group_id: 1, value: 'bar' }, { group_id: 1, value: 'bar' }, { group_id: 1, value: 'bar' }, { group_id: 2, value: 'bar' }, { group_id: 2, value: 'foo' }, { group_id: 2, value: 'foo' }, { group_id: 2, value: 'foo' } ] Para cada group_id , quiero devolver el valor que ocurre más. Así que mi salida debería ser algo como esto...
[ { group_id: 1, maxValue: 'bar', maxValueCount: 3 }, { group_id: 2, maxValue: 'foo', maxValueCount: 3 } ]¿Cómo harías esto usando la función agregada Mongoose?
Actualización: esto es todo lo que he conseguido, solo necesito devolver el valor del conteo máximo ahora...
const records = await Record.aggregate([ { $group: { _id: { id: '$group_id', value: '$value' }, count: { $sum: 1 } } } ])Usted puede lograr su objetivo por
data=[ { group_id: 1, value: 'foo' }, { group_id: 1, value: 'bar' }, { group_id: 1, value: 'bar' }, { group_id: 1, value: 'bar' }, { group_id: 1, value: 'bar' },//one more added { group_id: 2, value: 'bar' }, { group_id: 2, value: 'foo' }, { group_id: 2, value: 'foo' }, { group_id: 2, value: 'foo' } ] db.products.remove({}) db.products.insert(data) const stages = [ { $group: { _id: { group_id: '$group_id', value: '$value' }, n: { $sum: 1 } } }, { $group: { _id: '$_id.group_id', values: { $push: { value: '$_id.value', n: '$n' } } } }, { $project: { group_id:1, best: { $reduce: { input: '$values', initialValue: { n: 0, value: ''}, in: { $cond: [ { $lt: ['$$value.n', '$$this.n'] }, '$$this', '$$value' ] } } } }, }, { $project: { group_id: 1, value: '$best.value', maxValue: '$best.n' } } ] printjson(db.products.aggregate(stages).toArray())