MongoDB - подсчет документов на основе того, имеет ли поле конкретное значение на групповом этапе - PullRequest
0 голосов
/ 04 апреля 2020

Я написал запрос Mysql следующим образом:

SELECT account_id,date(date_posted) as date_posted,sum(if(message_format = 'e',1,0)) as email_count,sum(if(message_format = 't',1,0)) as 
sms_count,sum(if(message_format = 'p',1,0)) as push_count,sum(if(message_format = 's',1,0)) as slack_count
FROM `track_notifications` GROUP BY date(date_posted), account_id ORDER BY account_id

Результат MySQL показан на изображении ниже:

enter image description here

Я хочу получить то же, что и MySQL результат в MongoDB , я новичок в MongoDB . Как написать этот запрос в MongoDB

Я пытался так:

db.Datasets.aggregate([{$project:{_id:0,account_id:1,date_posted:1,message_format:{$ifNull:["$message_format",0]}}},{$sort:{"account_id":1}}])

Образцы документов:

_id:ObjectId(“5e8851dc53a883900d9b8e4b”)
account_id:52519
date_posted:”2018-11-19T15:38:52.000Z”
message_format:”t”

_id:ObjectId(“5e8851dc53a883900d9b8e4c”)
account_id:52519
date_posted:”2018-11-19T15:43:01.000Z”
message_format:”e”

_id:ObjectId(“5e8851dc53a883900d9b8e4d”)
account_id:52519
date_posted:”2018-11-19T15:38:51.000Z”
message_format:”e”

_id:ObjectId(“5e8851dc53a883900d9b8e4d”)
account_id:52519
date_posted:”2018-11-19T15:56:22.000Z”
message_format:”s”

_id:ObjectId(“5e8851dc53a883900d9b8e4e”)
account_id:52519
date_posted:”2018-11-19T15:56:22.000Z”
message_format:”p”

После долгого исследования и попытки я застрял здесь sum(if(message_format = 't',1,0)), Пожалуйста, помогите.

1 Ответ

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

Попробуйте запрос агрегации ниже:

Шаги:

  1. Вы бы сгруппировались на account_id и преобразовали date_posted и имели бы условную проверку на message_format field & pass 1 или 0 до $sum на основе значения поля, если поле равно null, то будет передано 0, поэтому при группировке документов, если 10 документов имеют message_format == e, то email_count будет 10, а остальные будут 0.
  2. Затем вы можете добавить account_id & date_posted поля, извлеченные из $_id.
  3. Удалить ненужные _id поле с использованием проекта.
  4. Сортировка по account_id, чтобы упорядочить итоговые документы в порядке возрастания.

Запрос:

db.track_notifications.aggregate([
      {
        $group: {
          _id: {
            account_id: "$account_id",
            date_posted: {
              $dateToString: { format: "%Y-%m-%d", date: "$date_posted" },
            },
          },
          email_count: {
            $sum: { $cond: [{ $eq: ["$message_format", "e"] }, 1, 0] },
          },
          sms_count: { $sum: { $cond: [{ $eq: ["$message_format", "t"] }, 1, 0] } },
          push_count: {
            $sum: { $cond: [{ $eq: ["$message_format", "p"] }, 1, 0] },
          },
          slack_count: {
            $sum: { $cond: [{ $eq: ["$message_format", "s"] }, 1, 0] },
          },
        },
      },
      {
        $addFields: {
          account_id: "$_id.account_id",
          date_posted: "$_id.date_posted",
        },
      },
      { $project: { _id: 0 } },
      { $sort: { account_id: 1 } },
    ]);  

Тест: MongoDB-Playground

Ссылка: операторы агрегации-конвейера

...