Tengo un esquema de tarea -
const taskSchema = new mongoose.Schema({ type: { type: String, default: '' }, completed_at: { type: Date, default: new Date() }, owner: { type: String, default: '' }, });Los tipos pueden ser - A, B y C.
Data de muestra -
[{type: A, completed_at: '12-10-2021', owner: 'xyz'}, {type: A, completed_at: '12-10-2021', owner: 'abc'}, {type: C, completed_at: '12-10-2021', owner: 'xyz'}, {type: C, completed_at: '13-10-2021', owner: 'xyz'}, {type: B, completed_at: '13-10-2021', owner: 'xyz'}]Quiero algo como esto -
[{owner: 'xyz', completed_at: [ {completed_at: '12-10-2021', A: 1, B: 0, C: 1}, {completed_at: '13-10-2021', A: 0, B: 1, C: 1} ] }, {owner: 'abc', completed_at: {completed_at: '12-10-2021', A: 1, B: 0, C: 0}}]Estoy realmente confundido acerca de cómo escribir una consulta para esto.
Prueba este:
db.collection.aggregate([ { $group: { _id: { owner: "$owner", completed_at: "$completed_at" }, type: { $push: "$type" } } }, { $group: { _id: "$_id.owner", completed_at: { $push: "$$ROOT" } } }, { $set: { completed_at: { $map: { input: "$completed_at", in: { completed_at: "$$this._id.completed_at", A: { $size: { $filter: { input: "$$this.type", as: "t", cond: { $eq: [ "$$t", "A" ] } } } }, B: { $size: { $filter: { input: "$$this.type", as: "t", cond: { $eq: [ "$$t", "B" ] } } } }, C: { $size: { $filter: { input: "$$this.type", as: "t", cond: { $eq: [ "$$t", "C" ] } } } } } } } } } ]) Por lo general, haría A , B y C dinámicamente, sin embargo, soy demasiado perezoso y me gusta irme a la cama.