Tengo una colección como esta:
[ {"userId": "0000", "algorithm": "algo1", "status": "Running", "waitingTime": 0}, {"userId": "0001", "algorithm": "algo1", "status": "Received", "waitingTime": 0}, {"userId": "0000", "algorithm": "algo2", "status": "Completed", "waitingTime": 123}, {"userId": "0000", "algorithm": "algo2", "status": "Error", "waitingTime": 134}, {"userId": "0001", "algorithm": "algo2", "status": "Error", "waitingTime": 150}, {"userId": "0001", "algorithm": "algo3", "status": "Completed", "waitingTime": 100}, {"userId": "0000", "algorithm": "algo3", "status": "Completed", "waitingTime": 120}, {"userId": "0001", "algorithm": "algo1", "status": "Received", "waitingTime": 0} ]Necesito encontrar el tiempo de espera máximo de cada usuario pero solo con el estado "Completado". La salida debe tener 2 accesorios para cada documento.
Para este ejemplo, la salida debería ser algo como esto:
[ {"_id": "0000", "maxWaitingTime": 123}, {"_id": "0001", "maxWaitingTime": 100} ]Traté de combinar algunas consultas de filtrado, pero no funcionó bien. Puedo combinar una o dos declaraciones, pero para esta estoy luchando.
Traté de combinar el método distinto con encontrar para obtener ID de usuario únicos, pero no funcionó:
db.tasks.distinct("userId").find();También traté de hacer la lógica dentro de la función de búsqueda:
printjsononeline(db.tasks.distinct(userId).find({ userId: "0001" }).map(doc => doc));Pero desafortunadamente no funcionó bien.
Deberá utilizar una agregación (consulte https://docs.mongodb.com/manual/aggregation/ ). El operador de match le permitirá filtrar según el estado y el operador de group le permitirá obtener el valor máximo del tiempo de espera para una identificación de usuario determinada.
db.collection.aggregate([ { "$match": {//Filter completed "status": "Completed" } }, { $group: {//Group by user id and find max "_id": "$userId", "waitingTime": { "$max": "$waitingTime" } } } ])Nota: Mongo distingue entre mayúsculas y minúsculas. Y la gente usa el tiempo de espera que el tiempo de espera.