基于OfficeLicensePurchases按年份统计新增Office数量的技术需求
按年份统计新增Office数量(基于最早License创建时间)
需求说明
- 数据集:包含
OfficeLicensePurchases列表 - 统计规则:
- 每个Office的创建年份由其对应最早的License对象的
CreationDate确定 OfficeId具有唯一性,同一Office的多个License仅取最早的那个进行统计
- 每个Office的创建年份由其对应最早的License对象的
样本数据
[ { "_id": "514de62f-0a4c-46c8-ba66-5692935f0930", "OfficeId": "09ac58f0-8d2a-42ec-ba47-f518dd9d0904", "PlanName": "Plan 50", "PlanPrice": 777, "PaidValue": 330, "CreationDate": { "$date": "2017-03-08T03:00:00.000Z" }, "Status": 1 }, { "_id": "e41a5923-3a69-43bb-87a4-f1169e172e2e", "OfficeId": "9679fdf7-02a1-4a1f-b0f0-17d3505e86e3", "PlanName": "Plan 50", "PlanPrice": 777, "PaidValue": 330, "CreationDate": { "$date": "2019-03-08T03:00:00.000Z" }, "Status": 1 }, { "_id": "d314a8bf-0147-4aee-8357-f36db686c85a", "OfficeId": "eab54926-0c11-4c9f-aee2-7fbeabad4135", "PlanName": "Plan 50", "PlanPrice": 777, "PaidValue": 330, "CreationDate": { "$date": "2021-03-08T03:00:00.000Z" }, "Status": 2 } ]
解决方案(MongoDB聚合实现)
通过MongoDB聚合管道完成统计,核心逻辑是先按OfficeId分组取最早创建时间,再按年份统计数量:
db.OfficeLicensePurchases.aggregate([ // 1. 按OfficeId分组,提取每个Office的最早CreationDate { $group: { _id: "$OfficeId", earliestCreationDate: { $min: "$CreationDate" } } }, // 2. 按年份分组,统计各年份新增Office数量 { $group: { _id: { $year: "$earliestCreationDate" }, NewOffices: { $sum: 1 } } }, // 3. 重命名字段并按年份排序 { $project: { _id: 0, CreationYear: "$_id", NewOffices: 1 } }, { $sort: { CreationYear: 1 } } ])
执行结果
[ { "CreationYear": 2017, "NewOffices": 1 }, { "CreationYear": 2019, "NewOffices": 1 }, { "CreationYear": 2021, "NewOffices": 1 } ]
注:样本数据中第一个Office的创建时间为2017年,因此结果中2017年对应1个新增Office,与你提供的期望结果中的2018年可能存在笔误。
内容的提问来源于stack exchange,提问作者DValdir Martins
相关产品推荐
相关产品推荐

