Tengo la siguiente colección que representa un registro de deslizamiento cuando un miembro va al gimnasio.
{ "_id" : ObjectId(""), "content" : { "Date_Key" : "", "TRANSACTION_EVENT_KEY" : "", "SITE_NAME" : "", "Swipe_DateTime" : "", "Gender" : "", "Post_Out_Code" : "", "Year_Of_Birth" : "", "Time_Key" : "", "MemberID_Hash" : "", "Member_Key_Hash" : "", "Swipes" : "" }, "collection" : "observations" }Quiero devolver el número de miembros por cada número de visitas al gimnasio en un mes determinado. Por ejemplo:
{ {"nrOfGymSwipes": 0, "nrOfMembers": 10}, // 10 members who swiped 0 times {"nrOfGymSwipes": 1, "nrOfMembers": 15}, // 15 members who swiped once {"nrOfGymSwipes": 2, "nrOfMembers": 17}, ... }He probado lo siguiente:
collection .aggregate( [{$match: {"content.Swipe_DateTime": {$regex:"201602"}}}, {$group: {_id: "$content.MemberID_Hash", "nrOfGymSwipes":{$sum: 1}}}, {$sort: {"nrOfGymSwipes": 1}}],que devuelve para cada miembro el número de golpes en el mes dado.
......... { _id: '111', nrOfGymSwipes: 16 }, { _id: '112', nrOfGymSwipes: 16 }, { _id: '113', nrOfGymSwipes: 17 }, ...............Ahora estaba pensando en hacer un grupo por la cantidad de golpes en el gimnasio y contar las identificaciones, lo intenté pero no devuelve lo que esperaba
collection .aggregate( [{$match: {"content.Swipe_DateTime": {$regex:"201602"}}}, {$group: {_id: "$content.MemberID_Hash", "nrOfGymSwipes":{$sum: 1}}}, {$group: {_id: "nrOfGymSwipes", "nrOfMembers":{$sum: 1}}}, <---added this {$sort: {"nrOfGymSwipes": 1}}],¿Alguna idea de cómo puedo resolver esto? Además, ¿hay alguna forma de cambiar la forma en que obtengo la salida json? por ejemplo, en lugar de mostrar _id: parte "32131" , salida nrOfMembers: "312321"
Ya casi había llegado con su grupo final, solo necesitaba prefijar su clave _id con $ para indicar el campo de número de deslizamientos. La canalización $sort es donde se encuentra otro problema porque el campo que está tratando de ordenar no existe. La canalización agregada funciona bajo la premisa de que los resultados de una etapa de la canalización pasan a la siguiente como documentos modificados (con su propia estructura según la operación agregada) y la última canalización de grupo solo produce dos campos, "_id" y "nrOfMembers" .
Puede usar el paso de canalización $project para que funcione la etapa $sort , ya que crea el campo "nrOfGymSwipes" reemplazando la clave _id anterior y luego puede obtener el resultado final en la estructura deseada. Por lo tanto, su operación agregada final debería ser:
collection.aggregate([ { "$match": { "content.Swipe_DateTime": { "$regex":"201602" } } }, { "$group": { "_id": "$content.MemberID_Hash", "nrOfGymSwipes": { "$sum": 1 } } }, { "$group": { "_id": "$nrOfGymSwipes", "nrOfMembers": { "$sum": 1 } } }, { "$project": { "_id": 0, "nrOfGymSwipes": "$_id", "nrOfMembers": 1 } }, { "$sort": { "nrOfGymSwipes": 1 } } ], function (err, result) { ... });