MongoDB - Агрегация для поиска нет. Дата записи мудрый - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь реализовать запрос в MongoDB, чтобы получить количество моих записей в коллекции базы данных на основе даты загрузки столбца. Это просто, как Найти максимальные идентификаторы объектов для каждой записи и затем сгруппировать их по дате

Поскольку у меня есть несколько записей для одного загружаемого файла, которые разделены ObjectID. Следовательно, мне нужно сгруппировать все строки по дате, но дублирующиеся записи должны рассматриваться только с максимальными идентификаторами.

db.fs.files.aggregate([
  {
    $group: {
      _id: {
        $add: [
          {
            $dayOfYear: "$uploadDate"
          },
          {
            $multiply: [
              400,
              {
                $year: "$uploadDate"
              }
            ]
          }
        ]
      },
      _id2: {
        $max: "$_id"
      },
      TotalUploads: {
        $sum: 1
      },
      f: {
        $min: "$uploadDate"
      }
    }
  },
  {
    $sort: {
      _id: 1
    }
  },
  {
    $project: {
      date: "$f",
      TotalUploads: 1,
      object: "$_id2",
      _id: 0
    }
  }
])

{
    "_id": ObjectId("1"),
    "filename": "22152_106046_6323041591916_D_04012209.jpg",
    "length": NumberLong(287171),
    "chunkSize": 261120,
    "uploadDate": ISODate("2019-11-26T06:05:38.269Z"),
    "md5": "1223112",
    "metadata": {
      "_contentType": "image/jpg",
      "createdOn": ISODate("2019-11-26T06:05:38.074Z"),
      "createdBy": "abc",
      "uploadStatus": "uploaded",
      "fileName": "22152_106046_6323041591916_D_04012209.jpg",
      "formType": "D",
      "elementIdAccountNoUin": "22152-106046-6323041591916",
      "contentType": "image/jpg",
      "formDate": ISODate("2209-01-04T05:00:00Z"),

    }
}

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 08 января 2020

Допустим, 1 января у меня есть две загрузки с одним и тем же файлом, но идентификатор объекта будет другим. Точно так же у меня есть 1 загрузка на 2 января. Поэтому, когда я посчитал дату загрузки, она вернет «1» для 1 января [сгруппировав только ту, которая имеет максимальный идентификатор объекта, т.е. последнюю загрузку], и «1» для 2 января.

Следующий запрос агрегации сгруппирует по дате (год / месяц / день) и найдет максимальное значение _id для каждой группировки / даты.

db.test.aggregate( [
  { 
      $group: { 
          _id: { $dateToString: { date: "$uploadDate", format: "%Y-%m-%d" } }, 
          maxId: { $max: "$_id" }
      }
  },
  { 
      $project: { uploadDate: "$_id", maxId: 1, fileCount: { $literal: 1 }, _id: 0 } 
  }
] )

Для входных документов:

{ "_id" : 1 "filename" : "a.jpg", "uploadDate" : ISODate("2019-11-26T06:05:38.269Z" }
{ "_id" : 2, "filename" : "b.jpg", "uploadDate" : ISODate("2019-11-26T06:05:38.269Z" }
{ "_id" : 3, "filename" : "c.jpg", "uploadDate" : ISODate("2019-11-30T06:05:38.269Z" }

Выход:

{ "maxId" : 3, "fileCount" : 1, "uploadDate" : "2019-11-30" }
{ "maxId" : 2, "fileCount" : 1, "uploadDate" : "2019-11-26" }
...