如何基于现有NoSQL数据格式编写MongoDB查询获取所需统计数据
MongoDB聚合查询实现方案
你提出的两个统计需求均可通过MongoDB聚合管道实现,对应查询语句如下:
需求1:2021年9月usedCar类别按theNumberOfSold排序列表
db.collection.aggregate([ // 筛选符合品类和时间范围的文档 { $match: { Category: "usedCar", date: { $gte: ISODate("2021-08-31T15:00:00Z"), // 适配东9区,对应2021-09-01 00:00:00 $lt: ISODate("2021-09-30T15:00:00Z") // 适配东9区,对应2021-10-01 00:00:00 } } }, // 展开Data数组为单条文档 { $unwind: "$Data" }, // 按汽车名称分组,统计指定时间段内总销量 { $group: { _id: "$Data.name", totalSold: { $sum: "$Data.theNumberOfSold" } } }, // 按销量降序排序,如需升序可将参数改为1 { $sort: { totalSold: -1 } }, // 调整输出字段格式,可根据需求调整 { $project: { _id: 0, name: "$_id", theNumberOfSold: "$totalSold" } } ])
需求2:2021年1月~7月newCar类别按theNumberOfSold排序列表
db.collection.aggregate([ { $match: { Category: "newCar", date: { $gte: ISODate("2020-12-31T15:00:00Z"), // 适配东9区,对应2021-01-01 00:00:00 $lt: ISODate("2021-07-31T15:00:00Z") // 适配东9区,对应2021-08-01 00:00:00 } } }, { $unwind: "$Data" }, { $group: { _id: "$Data.name", totalSold: { $sum: "$Data.theNumberOfSold" } } }, { $sort: { totalSold: -1 } }, { $project: { _id: 0, name: "$_id", theNumberOfSold: "$totalSold" } } ])
注意:如果你的date字段存储为字符串格式而非ISODate类型,需要在$match阶段前新增
{ $addFields: { date: { $toDate: "$date" } } }将字段转换为日期类型再做范围过滤。
内容的提问来源于stack exchange,提问作者grit-ki
相关产品推荐
相关产品推荐

