Добавьте новое поле в каждый документ с помощью агрегации и $ facet в mongodb - PullRequest
2 голосов
/ 15 апреля 2020

Данные моего образца выглядят следующим образом:

Category      response
Privacy         1
Mobile          1
Privacy         1
Privacy         2

Я хочу добавить новое поле Total, взятое из суммы всех значений поля response. Требуемый вывод, как показано ниже:

Category      response   Total
Privacy         1         5
Mobile          1         5
Privacy         1         5
Privacy         2         5

Как я могу получить этот вывод в mongodb.

1 Ответ

1 голос
/ 15 апреля 2020

Обновление: Поскольку значение Total не является фиксированным, обновленный ответ с вопросом:

/** Using 'facet' as we need docs to be returned in result 
  * (Can also be done without 'facet' by pushing all docs into an array in '$group' but it may not work for large datasets) */
db.collection.aggregate([
  {
    $facet: {
      data: [ { $match: {} } ], /** Get all docs without any filter */
      total: [
        {
          $group: { /** Group all docs & sum-up 'result' field */
            _id: "",
            Total: { $sum: "$response" }
          }
        }
      ]
    }
  },
  {
    $unwind: "$data"
  },
  {
    $unwind: "$total"
  },
  /** Merge 'total' field into 'data' & make data field as new root for documents */
  {
    $replaceRoot: { newRoot: { $mergeObjects: [ "$total", "$data" ] } }
  }
])

Тест: MongoDB- Детская площадка

Old: Если Total одинаковое значение для всех документов.

Если для всех документов в результате агрегирования необходимо добавить одинаковое значение, просто используйте этап агрегирования $ addFields :

{ $addFields : { Total :5 } }
...