MongoDB动态父级为未知国家代码时查询最新lastSalesDate的方法
实现方案
直接使用MongoDB聚合管道即可完成需求,核心是通过$objectToArray操作符处理动态的国家代码字段,无需提前知晓所有国家编码,完整实现逻辑如下:
- 第一步:将文档中动态的国家字段转换为键值对数组,过滤掉
_id、title等固定非国家字段 - 第二步:拆分数组后每个元素对应单个国家的完整数据
- 第三步:提取每个国家对应的
lastSalesDate字段 - 第四步:按日期降序排序后取第一条即为最新的销售日期记录
聚合查询示例代码如下:
db.collection.aggregate([ // 匹配需要查询的目标文档,可按实际业务需求调整匹配条件 { $match: { _id: ObjectId("5d82009cddf8d111b0f5c0f9") } }, // 将整个文档转换为键值对数组并过滤非国家字段 { $project: { countryFields: { $filter: { input: { $objectToArray: "$$ROOT" }, cond: { $not: { $in: ["$$this.k", ["_id", "title"]] } } } } }, // 拆分国家字段数组 { $unwind: "$countryFields" }, // 提取需要的字段 { $project: { countryCode: "$countryFields.k", lastSalesDate: "$countryFields.v.sales.lastSalesDate" } }, // 按销售日期降序排序 { $sort: { lastSalesDate: -1 } }, // 取最新的一条记录 { $limit: 1 } ])
如果需要对全表所有文档都执行该逻辑,去掉第一阶段的$match条件,再增加$group阶段按_id分组即可。
内容的提问来源于stack exchange,提问作者jvm
相关产品推荐
相关产品推荐

