Mongodb Как Агрегировать, Но Включать Только Один Результат В Поле Даты?

#mongodb

Вопрос:

Я пытаюсь обобщить результаты, но мне нужно включить только 1 результат за дату/день. Вот как выглядит мой запрос в настоящее время:

 .aggregate([
        {
          $lookup: {
            from: 'community_stats',
            as: 'stats',
            let: { id: '$_id' },
            pipeline: [
              {
                $match: {
                  $expr: { $eq: ['$community', '$id'] },
                },
              },
              { $sort: { date: -1 } },
              { $limit: 5 },
            ],
          },
        },
      ])
 

Который возвращает массив, подобный этому:

 stats: [
    {
      _id: new ObjectId("613d42f20e8023815b8f0ad3"),
      community: new ObjectId("6138ef0a00895c22c6cd3b68"),
      data: [Object],
      date: 2021-09-11T23:59:46.998Z
    },
    {
      _id: new ObjectId("613b784e564ee6ad3e2dbb14"),
      community: new ObjectId("6138ef0a00895c22c6cd3b68"),
      data: [Object],
      date: 2021-09-10T15:22:54.764Z
    },
    {
      _id: new ObjectId("6139f9487e4c964ef9dafd11"),
      community: new ObjectId("6138ef0a00895c22c6cd3b68"),
      data: [Object],
      date: 2021-09-09T12:08:40.198Z
    },
    {
      _id: new ObjectId("6139f6eac570e66aa60a8b5f"),
      community: new ObjectId("6138ef0a00895c22c6cd3b68"),
      data: [Object],
      date: 2021-09-09T11:58:34.463Z
    }
  ]
 

Кто-нибудь знает, как это можно сделать?

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

1. Пожалуйста, предоставьте примерные данные

Ответ №1:

Вы просто хотите добавить групповой этап$, в котором вы группируете матчи по дате, вот так:

 db.collection.aggregate([
  {
    $lookup: {
      from: "community_stats",
      as: "stats",
      let: {
        id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$community",
                "$id"
              ]
            }
          }
        },
        {
          $group: {
            _id: {
              year: {
                "$year": "$date"
              },
              month: {
                "$month": "$date"
              },
              day: {
                "$dayOfMonth": "$date"
              },
              
            },
            first: {
              $first: "$ROOT"
            }
          }
        },
        {
          "$replaceRoot": {
            "newRoot": "$first"
          }
        },
        {
          $sort: {
            date: -1
          }
        },
        {
          $limit: 5
        }
      ]
    }
  }
])
 

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

В моем примере используется $first для выбора первого документа из каждого дня, однако вы можете использовать разные операторы / логику, если ее необходимо изменить.