Node.js 通过createdAt和staffId将mongoose日期(不含时间和组)与每周、每月和每年的员工总数(通过聚合)进行比较?
可能是问题看起来像是重复的,但为此道歉 我想将Node.js 通过createdAt和staffId将mongoose日期(不含时间和组)与每周、每月和每年的员工总数(通过聚合)进行比较?,node.js,mongodb,mongoose,aggregation-framework,restapi,Node.js,Mongodb,Mongoose,Aggregation Framework,Restapi,可能是问题看起来像是重复的,但为此道歉 我想将createdAt属性的周、月、年结果汇总到一起,不需要时间和staffId 模型如下所示: { "_id" : ObjectId("5f351f3d9d90b1281c44c5dp"), "staffId" : 12345, "category" : "trend", "page_route"
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},
]
[
{_id: "2020-11-8", total: 4},
]
示例2)每月一次
[
{_id: "2020-11-13", total: 2},
{_id: "2020-11-8", total: 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 } }
];
你可以试试
- 每周分组
- 按月分组
- 逐年分组
createdAt
字段从客户端语言更改日期格式
你可以试试
- 每周分组
- 按月分组
- 逐年分组
createdAt
字段从客户端语言更改日期格式
到目前为止你尝试了什么?@WernfriedDomscheit,我已经更新了相关信息。你能告诉我到目前为止你尝试了什么吗?@WernfriedDomscheit,我已经更新了相关信息。请注意,有一个小问题,如果同一个staffid在同一日期多次出现,那么它应该返回1个计数,因为同一时间我们希望使用createdAt和staffid进行分组。我们如何才能实现您可以像这样按staffId分组,如果这不是您的期望,请提供预期结果。有一个小问题,如果同一个staffId在同一日期多次出现,那么它应该返回1个计数,因为我们希望在同一时间使用createdAt和staffId进行分组。我们如何才能做到这一点,你可以像这样分组,如果这不是你的期望,请你提供预期的结果。
db.collection.aggregate([
{
$group: {
_id: { $year: "$createdAt" },
createdAt: { $first: "$createdAt" },
count: { $sum: 1 }
}
}
])