MongoDB中如何查询字段最大/最小值并关联对应的唯一userId
你当前的$group只能返回极值本身,无法关联对应userId的核心原因是$min/$max聚合运算符仅返回字段值,不会保留该值对应的文档其他属性。你需要先把所有待统计的指标拆分为独立文档,再按指标维度分组取极值关联的userId,完整聚合逻辑如下:
完整聚合管道代码
const pipeline = [ // 步骤1:把6个待统计指标构造成数组,每条带指标名、值、对应userId { "$addFields": { "metrics": [ {"key": "r1t1", "value": "$r1.t1", "userId": "$userId"}, {"key": "r1t2", "value": "$r1.t2", "userId": "$userId"}, {"key": "r2t1", "value": "$r2.t1", "userId": "$userId"}, {"key": "r2t2", "value": "$r2.t2", "userId": "$userId"}, {"key": "r1eff", "value": "$r1.efficiency", "userId": "$userId"}, {"key": "r2eff", "value": "$r2.efficiency", "userId": "$userId"} ] } }, // 步骤2:把数组拆分为独立文档,每个文档对应一个指标的单条记录 {"$unwind": "$metrics"}, // 步骤3:生成排序权重,效率类指标按值倒序,其余按值正序 { "$set": { "sortWeight": { "$cond": { "if": {"$regexMatch": {"input": "$metrics.key", "regex": /eff$/}}, "then": {"$multiply": ["$metrics.value", -1]}, "else": "$metrics.value" } } } }, // 步骤4:按排序权重正序排列,确保每个指标的目标极值排在最前 {"$sort": {"sortWeight": 1}}, // 步骤5:按指标名分组,取排在最前的记录即为目标极值关联的信息 { "$group": { "_id": "$metrics.key", "userId": {"$first": "$metrics.userId"}, "value": {"$first": "$metrics.value"} } }, // 可选步骤:调整输出格式匹配你的预期 { "$project": { "_id": 0, "userId": 1, "$_id": "$value" } } ]
执行结果说明
执行上述管道后会返回6条文档,每条对应一个极值和关联的userId,如果需要合并为单个对象,可以在最后追加$group阶段把所有文档合并即可。
内容的提问来源于stack exchange,提问作者tigram10
相关产品推荐
相关产品推荐

