Tengo una colección que incluye documentos con esta estructura:
{ car: carId, seller: sellerId, buyer: buyerId, timestamp: timestamp }Quiero extraer el recuento único de propietarios de automóviles nuevos (primera vez que tuve un automóvil) por mes.
Así que el resultado esperado sería como:
[ { date: 2022-01-01T00:00:00.000+00:00, newCarOwners: 28 }, { date: 2022-02-01T00:00:00.000+00:00, newCarOwners: 18 }, { date: 2022-03-01T00:00:00.000+00:00, newCarOwners: 10 } ... ]Creo que puedo lograrlo agrupando los documentos por mes y carId, luego encontrar propietarios (el ID de comprador de la última transacción para cada carId) por mes. A continuación, excluya a los propietarios (acumulativos) de meses anteriores.
$setWindowFields podría ser útil, pero no pude encontrar una manera de excluir a los propietarios de meses anteriores.
En este momento, mi tubería se ve así:
[ { $set: { month: { $dateTrunc: { date: { $toDate: '$timestamp' }, unit: 'month', binSize: 1, timezone: 'GMT', } } } }, { $group: { _id: { month: '$month', carId: '$carId' }, doc: { $max: { ts: '$timestamp', buyer: '$buyer' } } } }, { $group: { _id: { month: '$_id.month' }, owners: { $addToSet: '$doc.buyer' } } } ]Estoy abierto a cualquier idea/solución, también podría ser de otra manera que no sea la mía.
Gracias.
db.collection.aggregate([ { $group: { _id: "$buyer", firstTime: { $min: "$timestamp" }, count: { $sum: 1 } } }, { $match: { count: 1 } }, { $group: { _id: { $dateTrunc: { date: { $toDate: "$firstTime" }, unit: "month", binSize: 1, timezone: "GMT" } }, newCarOwners: { $sum: 1 } } } ])