MongoDB find反向匹配查询:筛选双向互赞的关系记录
双向点赞匹配记录查询实现
你当前的点赞关系存储结构下,要筛选出所有存在双向互赞的记录,可通过MongoDB聚合管道实现,逻辑和代码如下:
实现逻辑
- 为每条点赞记录生成统一的配对标识:将
from和to的用户ID按固定规则(比如字典序排序)拼接成唯一键,互赞的两条反向记录会生成完全相同的配对键 - 按配对键分组,统计每个配对下的记录量,同时保留组内所有原始文档
- 过滤掉记录量不足2的分组,仅保留存在双向点赞的配对
- 将分组内的原始记录拆分还原,输出和原集合结构一致的结果
可直接运行的聚合代码
假设你的存储集合名为user_likes,执行以下聚合语句即可得到预期结果:
db.user_likes.aggregate([ { $addFields: { pairKey: { $cond: { if: { $lt: ["$from", "$to"] }, then: { $concat: ["$from", "|", "$to"] }, else: { $concat: ["$to", "|", "$from"] } } } } }, { $group: { _id: "$pairKey", likeCount: { $sum: 1 }, matchRecords: { $push: "$$ROOT" } } }, { $match: { likeCount: 2 } }, { $unwind: "$matchRecords" }, { $replaceRoot: { newRoot: "$matchRecords" } } ])
注意事项
如果你的业务存在同一用户对另一用户重复点赞的场景(即单方向存在多条相同from、to的记录),需要将分组后的匹配条件调整为「组内去重后的from用户数量为2」,避免单方向重复点赞被误判为双向匹配。
用你给出的示例数据执行上述语句,输出结果和预期完全一致:
[ {"from":"_id1", "to":"_id2"}, {"from":"_id2", "to":"_id1"} ]
内容的提问来源于stack exchange,提问作者AlpeshVasani
相关产品推荐
相关产品推荐

