#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" } }