Агрегация MongoDB: получить день, месяц и год из даты / метки времени в массиве - PullRequest
1 голос
/ 18 июня 2020

Этот синтаксис предназначен для поиска любой даты объекта "gt" или между двумя датами с "lt", поэтому я делаю это:

db.compte.aggregate([
  {
    $project: {
      time: {
        $filter: {
          input: "$auditMessages",
          as: "auditMessages",
          cond: {
            $and: [
              {
                $gt: ["$$auditMessages.timestamp", "2020-05-20T07:18:42.115Z"]
              }
            ]
          }
        }
      }
    }
  }
]);

И это результат, он работает:

{
  _id: ObjectId"5ed638e566a699750cbb1b0f"),
  time: [
    {
      eventCategory: "Audit",
      objectType: "Audit Log",
      eventAction: "Query",
      status: "Initiated",
      username: "Unknown",
      userId: "Unknown",
      timestamp: "2020-05-20T07:19:05.149Z",
      eventDescription: "Querying without filters."
    },
    {
      eventCategory: "Audit",
      objectType: "Audit Log",
      eventAction: "Query",
      status: "Successful",
      username: "Unknown",
      userId: "Unknown",
      timestamp: "2020-05-20T07:18:42.232Z",
      eventDescription: "Querying without filters."
    }
  ]
}

Теперь я хочу найти день, месяц и год, например, мне нужна такая метка времени: год: 2020 месяц: 05 день: 20 час: 07 минута: 18 и миллисекунда: 42

Спасибо за аванс.

1 Ответ

0 голосов
/ 18 июня 2020

Все, что вам нужно, это оператор агрегирования $ dateToParts :

В качестве поля даты, т.е. timestamp находится в массиве, который мы повторяем, используя $map и объединяя все поля year, month, hour, minute et c .. в фактический объект и отталкивая объект в массив time.

db.collection.aggregate([
  {
    $addFields: {
      time: {
        $map: {
          input: "$time",
          in: {
            $mergeObjects: [
              "$$this",
              {
                $dateToParts: {
                  date: "$$this.timestamp"
                }
              }
            ]
          }
        }
      }
    }
  }
])

Тест: mongoplayground

Примечание:

На всякий случай, если ваше поле timestamp является строкой, вам нужно преобразовать его в дату, используя оператор $ dateFromString . Проверьте это: mongoplayground

Здесь изменения будут:

 {
    $dateToParts: {
         date: {
           $dateFromString: {
               dateString: "$$this.timestamp"
            }
         }
      }
   }
...