Как выполнить агрегирование mongodb для многоуровневых / вложенных документов?

#mongodb #mongoose

#mongodb #mongoose

Вопрос:

У меня есть mongodb коллекция под названием tasks. Здесь T1.1 T1 есть подзадача T1.1.1 , T1.1 а также подзадача и так далее.. Уровни подзадач могут увеличиваться. Я использую mongodb версию 4.0 . Ниже приведены данные сбора

 ---------------------------------------
task     | parent_task_id | progress(%)
---------------------------------------
T1       | null           | 20
---------------------------------------
T2       | null           | 30
---------------------------------------
T1.1     | T1             | 10
---------------------------------------
T1.2     | T1             | 10
---------------------------------------
T1.1.1   | T1.1           | 10
---------------------------------------
T1.1.2   | T1.1           | 10
---------------------------------------
T1.1.1.1 | T1.1.1         | 10
---------------------------------------
 

Как мне рассчитать средний прогресс задачи T1 , включая все подзадачи ( T1.1,T1.2,T1.1.1,T1.1.2,T1.1.1.1 ), используя mongodb агрегации?

Заранее спасибо.

Ответ №1:

 db.collection.aggregate([
  {
    $match: {
      "task": {//Find all subtasks using pattern
        $regex: "^T1.*"
      }
    }
  },
  {
    $group: {
      "_id": null,
      "avg": {//Avg of the matched tasks' progress
        "$avg": "$progress"
      }
    }
  }
])
 

Пример игровой площадки

Комментарии:

1. Спасибо за ответ. Это решение работает нормально. Но если идентификатор задачи — это идентификатор, сгенерированный mongodb, то как мне этого добиться? @Gibbs

2. Как вы определяете, является ли это T1 или T2 с сгенерированным идентификатором mongo? У вас может быть другое поле для идентификации.

3. Спасибо @gibbs. Я сгенерирую один формат, чтобы я мог определить, связан ли он с задачей T1 или задачей T2

4. Рад, что это помогло. Если ответ полезен, можете ли вы одобрить и проголосовать?