Tengo el siguiente esquema de datos y trato de encontrar la frecuencia de 'eventType' en función del campo 'country'. Estoy usando Mongoose en una aplicación Nodejs.
{ username: "jack", events: [ { eventType: "party", createdAt: "2022-01-23T10:26:11.214Z", visitorInfo: { location: { country: 'US' } } }, { eventType: "party", createdAt: "2022-01-30T10:26:11.214Z", visitorInfo: { location: { country: 'US' } } }, { eventType: "party", createdAt: "2022-01-29T10:26:11.214Z", visitorInfo: { location: { country: 'US' } } }, { eventType: "meeting", createdAt: "2022-01-29T10:26:11.214Z", visitorInfo: { location: { country: 'US' } } }, { eventType: "meeting", createdAt: "2022-01-31T10:16:11.214Z", visitorInfo: { location: { country: 'GB' } } }, { eventType: "meeting", createdAt: "2022-01-31T10:16:11.214Z", visitorInfo: { location: { country: 'GB' } } }, { eventType: "party", createdAt: "2022-01-31T10:16:10.214Z", visitorInfo: { location: { country: 'GB' } } } ] }Lo que estoy intentando hasta ahora:
db.collection.aggregate([ { $match: { username: "jack" } }, { $unwind: "$events" }, { $match: { "events.eventType": "party" } }, countries: [ { $group: { _id: "$events.visitorInfo.location.country", frequency: { $sum: 1 }, }, } { $project: { _id: 0, countries: "$countries" } } ] } ])Estoy tratando de hacer coincidir los tipos de eventos aquí y luego agruparlos por país. Otro enfoque podría ser obtener primero una lista de países únicos y luego encontrar la frecuencia de eventos en cada uno de esos países. Se agradece cualquier comentario sobre estos enfoques.
Básicamente lo que espero obtener como resultado:
countryAndEventFrequency: [ { country: 'US', party: 3, meeting: 1 }, { country: 'GB', party: 2, meeting: 1 }, ]Agradezco cualquier ayuda u orientación. ¡Gracias!
db.collection.aggregate([ { $unwind: "$events" }, { $project: { party: { $cond: [ { $eq: [ "$events.eventType", "party" ] }, 1, 0 ] }, meeting: { $cond: [ { $eq: [ "$events.eventType", "meeting" ] }, 1, 0 ] }, country: "$events.visitorInfo.location.country" } }, { $group: { _id: "$country", meeting: { $sum: "$meeting" }, party: { $sum: "$party" } } }, { $project: { country: "$_id", meeting: 1, party: 1 } }, { $group: { _id: "cc", countryAndEventFrequency: { $push: "$$ROOT" } } }, { $project: { _id: 0, countryAndEventFrequency: 1 } } ])explicado: