MongoDB聚合管道中$merge如何基于两个字段做唯一性校验?
MongoDB $merge 多字段重复校验方案
首先明确:$merge的on参数支持指定多个字段组成复合键来判断文档是否重复,完全满足你同时校验userId和questionId的需求。
具体用法是把这两个字段放在数组里传给on参数,MongoDB会将两个字段的组合作为唯一匹配条件。举个实际的聚合管道例子:
假设你的聚合管道最后阶段用$merge写入user_question_scores集合,当userId和questionId的组合匹配时更新score字段,否则插入新文档:
db.your_source_collection.aggregate([ // 你的其他聚合阶段,比如计算score等 { $merge: { into: "user_question_scores", on: ["userId", "questionId"], // 用两个字段的组合作为匹配键 whenMatched: { $set: { score: "$$new.score" } }, // 匹配到则更新score whenNotMatched: "insert" // 未匹配到则插入新文档 } } ])
这个逻辑能处理你提到的场景:如果集合里已有{userId:1, questionId:1, score:0},当聚合输出的{userId:1, questionId:1, score:1}进来时,会触发whenMatched逻辑把score更新为1;如果是新的userId+questionId组合,就直接插入新文档。
另外建议:如果集合还没针对userId和questionId创建复合唯一索引,最好补上一个,从数据库层面强制保证这两个字段的组合唯一性,避免并发写入时出现重复数据:
db.user_question_scores.createIndex({ userId: 1, questionId: 1 }, { unique: true })
内容的提问来源于stack exchange,提问作者Hinson Chan
相关产品推荐
相关产品推荐

