如何调整MongoDB查询以按UCODE获取最新交易记录?
需求:筛选指定记录,仅返回每个UCODE对应的最新交易记录
原始数据
_id ucode value createDate ------------------------------------------------------------------------------------- 63a997ac1 08905ba5-4188-4f5f-b982-123456789012 10 2020-02-10 09:00:00 398fdd112 08905ba5-4188-4f5f-b982-123456789012 647 2020-02-11 09:00:00 561e4c033 1beced7e-b0ad-43e7-bd8d-d3c7cf2a1234 99 2020-02-12 10:00:00 63a997ac4 08905ba5-4188-4f5f-b982-xxxxxa3b0396 10 2020-02-13 09:00:00 398fdd115 08905ba5-4188-4f5f-b982-xxxxxa3b0396 777 2020-02-14 09:00:00 561e4c036 1beced7e-b0ad-43e7-bd8d-d3c7cf2axxxx 234 2020-02-15 10:00:00 63a997ac7 08905ba5-4188-4f5f-b982-906d2a3baaaa 610 2020-02-16 09:00:00 398fdd118 08905ba5-4188-4f5f-b982-906d2a3baaaa 647 2020-02-17 09:00:00 561e4c039 1beced7e-b0ad-43e7-bd8d-d3c7cf2axxxx 999 2020-02-18 10:00:00
现有聚合查询
db.transaction.aggregate([ { $match: {ucode: {$in:[:listOfUcode]}, createDate: { "$gte": ISODate(:start), "$lte": ISODate(:end) } } }, { $sort: { ucode: 1, createDate: -1 } }, ])
期望结果
_id ucode value createDate ------------------------------------------------------------------------------------- 398fdd112 08905ba5-4188-4f5f-b982-123456789012 647 2020-02-11 09:00:00 561e4c033 1beced7e-b0ad-43e7-bd8d-d3c7cf2a1234 99 2020-02-12 10:00:00 398fdd115 08905ba5-4188-4f5f-b982-xxxxxa3b0396 777 2020-02-14 09:00:00 398fdd118 08905ba5-4188-4f5f-b982-906d2a3baaaa 647 2020-02-17 09:00:00 561e4c039 1beced7e-b0ad-43e7-bd8d-d3c7cf2axxxx 999 2020-02-18 10:00:00
调整后的查询方案
在现有查询基础上新增分组和字段还原阶段,确保返回每组UCODE对应的完整最新交易记录:
db.transaction.aggregate([ // 筛选指定UCODE和时间范围的记录 { $match: {ucode: {$in:[:listOfUcode]}, createDate: { "$gte": ISODate(:start), "$lte": ISODate(:end) } } }, // 按UCODE升序、创建时间降序排序,让每组最新记录排在首位 { $sort: { ucode: 1, createDate: -1 } }, // 按UCODE分组,提取每组第一条完整记录(即最新交易) { $group:{ _id: "$ucode", latestTransaction: { $first: "$$ROOT" } } }, // 将最新交易记录还原为原始文档结构 { $replaceRoot: { newRoot: "$latestTransaction" } } ])
说明:原方案仅提取了日期和交易数量,无法得到完整的交易记录。上述调整通过$first: "$$ROOT"获取每组第一条完整文档,再用$replaceRoot恢复原始字段结构,与期望结果完全匹配。
内容的提问来源于stack exchange,提问作者Patrick Teixeira
相关产品推荐
相关产品推荐

