Может быть, вопрос выглядит как дубликат, но извините за это.
Я хочу агрегировать еженедельные, ежемесячные, ежегодные результаты createdAt
свойства без учета времени и staffId
.
Модель выглядит следующим образом:
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dp"),
"staffId" : 12345,
"category" : "trend",
"page_route" : "http://example.com/rer",
"expireAt" : ISODate("2020-08-13T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-13T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-13T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5de"),
"staffId" : 12346,
"category" : "incident",
"page_route" : "http://example.com/rergfhfhf",
"expireAt" : ISODate("2020-08-14T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-08T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-12T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dc"),
"staffId" : 12347,
"category" : "trend",
"page_route" : "http://example.com/rerrwe",
"expireAt" : ISODate("2020-08-13T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-13T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-13T11:08:45.199Z"),
"__v" : 0
}
{
"_id" : ObjectId("5f351f3d9d90b1281c44c5dr"),
"staffId" : 12348,
"category" : "trend",
"page_route" : "http://example.com/rerrwe",
"expireAt" : ISODate("2020-08-12T11:08:45.196Z"),
"createdAt" : ISODate("2020-08-08T11:08:45.199Z"),
"updatedAt" : ISODate("2020-08-12T11:08:45.199Z"),
"__v" : 0
}
Ожидаемый результат: Пример 1) Еженедельно
[
{_id: "2020-11-13", total: 2},
{_id: "2020-11-8", total: 2},
]
Пример 2) Ежемесячно
[
{_id: "2020-11-8", total: 4},
]
аналогично годовому...
Я использую nodejs и mongoose для реализации API.
Я много борюсь, но не могу добиться ожидаемого результата.
если кто-нибудь поможет мне, то это будет большая помощь.
Спасибо всем экспертам.
Я пробовал что-то вроде этого:
[
{
$match: {
createdAt: { $gte: new Date(currentDate), $lt: new Date(nextDate) }
}
},
{
$project: {
_id: 1,
staffId: 1,
day: {
$dayOfMonth: "$createdAt"
},
month: {
$month: "$createdAt"
},
year: {
$year: "$createdAt"
}
}
},
{
$project: {
_id: 1,
staffId: 1,
datetime: {
$concat: [
{
$substr: ["$year", 0, 4]
},
"-",
{
$substr: ["$month", 0, 2]
},
"-",
{
$substr: ["$day", 0, 2]
}
]
}
}
},
{
$group: {
_id: {
createdAt: "$datetime",
staffId: "$staffId"
}
}
},
{
$group: {
_id: {$week:"$_id.createdAt"},
total: {
$sum: 1
}
}
},
{ $sort: { _id: 1 } }
];
@WernfriedDomscheit, я обновил вопрос. Не могли бы вы направить
Можешь попробовать,
db.collection.aggregate([
{
$group: {
_id: {
year: { $year: "$createdAt" },
week: { $week: "$createdAt" }
},
createdAt: { $first: "$createdAt" },
count: { $sum: 1 }
}
}
])
db.collection.aggregate([
{
$group: {
_id: {
year: { $year: "$createdAt" },
month: { $month: "$createdAt" }
},
createdAt: { $first: "$createdAt" },
count: { $sum: 1 }
}
}
])
db.collection.aggregate([
{
$group: {
_id: { $year: "$createdAt" },
createdAt: { $first: "$createdAt" },
count: { $sum: 1 }
}
}
])
Вы можете изменить формат даты на языке вашего клиента, используя поле
createdAt
!
есть небольшая проблема, если один и тот же staffid встречается много раз в одну и ту же дату, тогда он должен возвращать 1 счет, потому что в одно и то же время мы хотим иметь группу с createdAt и staffId. как мы можем этого добиться
Вы также можете сгруппировать по staffId, как эта игровая площадка, если это не то, что вы ожидаете, можете ли вы предоставить ожидаемый результат.
Что вы пробовали до сих пор?