Как использовать агрегацию для подсчета документов и суммирования определенного поля?

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

Я пытаюсь получить количество потенциальных клиентов, которые соответствуют идентификатору списка, и объединить его с их стоимостью. Вот моя коллекция:

 [
  {
    "list_id": "5f76a53e8a93be772c14cc06",
    "fname": "John",
    "lname": "Doe",
    "cost": 0
  },
  {
    "list_id": "5f76a53e8a93be772c14cc06",
    "fname": "John",
    "lname": "Wayne",
    "cost": 0.65
  },
  {
    "list_id": "5f76a53e8a93be772c14cc06",
    "fname": "John",
    "lname": "Kelly",
    "cost": 1
  },
  {
    "list_id": "5f76a53e8a93be772c14cc06",
    "fname": "John",
    "lname": "Morrie",
    "cost": 0.40
  }
]
 

Я пытаюсь получить этот результат:

 [
  {
    "_id": null,
    "lead_count": 4
    "total_cost": 2.05
  }
]
 

Моя агрегация выглядит так:

 db.collection.aggregate([
  {
    "$match": {
      list_id: "5f76a53e8a93be772c14cc06"
    }
  },
  {
    "$group": {
      _id: null,
      total_cost: {
        $sum: "$cost"
      }
    }
  }
])
 

Но это только дает мне:

 [
  {
    "_id": null,
    "total_cost": 2.05
  }
]
 

Как мне нужно настроить его, чтобы он показывал то, что я хочу? Вот ссылка на игровую площадку: https://mongoplayground.net/p/zvLY67Oa_Ps

Ответ №1:

Вам нужно указать новое поле, которое вы хотите добавить, т.е. lead_count .

Необходим только еще один объект: "lead_count": { "$sum": 1 }, into $group stage.

Этап будет выглядеть так:

 "$group": {
  "_id": null,
  "lead_count": {
    "$sum": 1
  },
  "total_cost": {
    "$sum": "$cost"
  }
}
 

Обратите внимание, что таким образом вы создаете новое поле и используете $sum : 1 для увеличения единицы для каждого значения.
Это означает: вы создаете поле lead_count , в котором вы храните количество документов, которые соответствуют первому этапу.

Пример запроса здесь

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

1. Это работает. Добавлено a $project для удаления _id: null , и все готово. Спасибо.