Фильтровать коллекции MongoDB с множеством вариантов

#javascript #mongodb

#javascript #mongodb

Вопрос:

У меня есть такая коллекция:

 [
    {"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}
]
 

Мне нужно найти максимальное время ожидания каждого пользователя, но только со статусом «Завершено». На выходе должно быть 2 реквизита для каждого документа.

  • «_id» — который должен быть «идентификатором пользователя» из исходной коллекции
  • «maxWaitingTime» — должно быть равно максимальному времени ожидания статуса «Завершено»

Для этого примера вывод должен быть примерно таким:

 [
    {"_id": "0000", "maxWaitingTime": 123},
    {"_id": "0001", "maxWaitingTime": 100}
]
 

Я попытался объединить некоторые фильтрующие запросы вместе, но это не сработало. Я могу объединить один или два оператора, но для этого я борюсь.

Я попытался объединить метод distinct с find, чтобы получить уникальные идентификаторы пользователей, но это не сработало:

 db.tasks.distinct("userId").find();
 

Также я попытался выполнить логику внутри функции поиска:

 printjsononeline(db.tasks.distinct(userId).find({
    userId: "0001"
}).map(doc => doc));
 

Но, к сожалению, это не сработало.

Ответ №1:

Игровая площадка

 db.collection.aggregate([
  {
    "$match": {//Filter completed
      "status": "Completed"
    }
  },
  {
    $group: {//Group by user id and find max
      "_id": "$userId",
      "waitingTime": {
        "$max": "$waitingTime"
      }
    }
  }
])
 

Примечание: Mongo чувствителен к регистру. И люди используют waiting_time, а не waitingTime.

Ответ №2:

Вам нужно будет использовать агрегацию (см. https://docs.mongodb.com/manual/aggregation / ). match Оператор позволит вам фильтровать по статусу, а group оператор позволит вам получить максимальное значение времени ожидания для данного идентификатора пользователя.