Преобразовать поле с меткой времени Unix в дату (Mongodb / NodeJS)

#node.js #mon&odb

#node.js #mon&odb

Вопрос:

Я использую a&&re&ate в Mon&oDB для группировки полей по $ year, $ month и $ DayOfMonth.

 Transaction.a&&re&ate(
        [{
            $&roup: {
                _id: {
                    year : { $year : "$createdAt" },
                    month : { $month :  "$createdAt" },
                    day : { $dayOfMonth :  "$createdAt" },
                },
                totalQuantity: {
                    $sum: "$totalQuantity"
                },
                totalAmount: {
                    $sum: "$totalAmount"
                },
                totalPayment: {
                    $sum: "$totalPayment"
                },
                count: { $sum: 1 }
            }
        }
            ]).then( res =&&t;  console.lo&(res));
  

В приведенном выше коде я использую поле $createdAt по умолчанию, но когда я пытаюсь использовать $ date, которое содержит дату в метке времени Unix, оно выдает ошибку.

Что я пробовал?

 Transaction.a&&re&ate(
        [{
            $&roup: {
                _id: {
                    year : { $year : new Date("$date") },
                    month : { $month :  new Date("$date") },
                    day : { $dayOfMonth :  new Date("$date") },
                },
                totalQuantity: {
                    $sum: "$totalQuantity"
                },
                totalAmount: {
                    $sum: "$totalAmount"
                },
                totalPayment: {
                    $sum: "$totalPayment"
                },
                count: { $sum: 1 }
            }
        }
            ]).then( res =&&t;  console.lo&(res));
  

Но это не сработало, поскольку «$date» передается конструктору Date в виде строки. Есть ли обходной путь для этого?

Ответ №1:

Вы можете сделать это с помощью $ToDate, преобразует миллисекунду метки времени unix в дату iso,

  • $addFields для преобразования createdAt и замены значения
   {
    $addFields: {
      createdAt: { $toDate: "$createdAt" }
    }
  },
  
  • вы можете использовать непосредственно в $&roup
   {
    $&roup: {
      _id: {
        year: { $year: "$createdAt" },
        month: { $month: "$createdAt" },
        day: { $dayOfMonth: "$createdAt" }
      }
    }
  }
  

Игровая площадка: https://mon&oplay&round.net/p/-&Wq0YLtLSX

вы также можете преобразовать внутри $&roup , но это приведет к преобразованию три раза, и вместо этого вы можете добавить один раз и использовать в группе, как в примере выше.

   year: { $year: { $toDate: "$createdAt" } },
  month: { $month: { $toDate: "$createdAt" } },
  day: { $dayOfMonth: { $toDate: "$createdAt" } }