MongoDB聚合中匹配相等值返回布尔值异常问题排查
问题原因与解决办法
核心问题:数据类型不匹配
从返回结果能看到,uId和usId的字符串内容一模一样,但$eq却返回false——这是因为两者的数据类型不一样:
- 主文档里的
userId存储的是字符串类型 likedposts集合中的userId存储的是MongoDB ObjectId对象类型
MongoDB的$eq操作符会严格校验数据类型,哪怕字符串内容完全一致,只要类型不匹配,就会判定为不相等。
修复方案
方案1:聚合阶段统一类型再比较
修改$project阶段的判断逻辑,通过类型转换让两边数据类型一致,比如把ObjectId转成字符串:
{ $project: { usId: "$userId", uId: "$liked.userId", equ: { $cond: { if: { $eq: [{ $toString: "$liked.userId" }, "$userId"] }, then: true, else: false, }, }, }, }
方案2:统一数据库存储类型(更推荐)
如果业务允许,把所有关联用户ID的字段统一为同一种类型:
- 将主文档中的
userId从字符串类型改为ObjectId类型 - 确保
likedposts、profiles等集合中的用户ID字段也统一为ObjectId类型
这样后续查询无需额外做类型转换,逻辑更简洁,也能彻底避免这类类型不匹配问题。
额外优化:简化聚合逻辑
你当前用了多次$unwind处理liked数组,其实可以不用拆分数组,直接用$in判断当前用户是否在点赞列表中,还能避免$unwind导致的文档重复问题:
// 替换原有的两次针对liked的$unwind和$project阶段 { $addFields: { isLiked: { $in: [{ $toObjectId: "$userId" }, "$liked.userId"] } } }
内容的提问来源于stack exchange,提问作者saqib sattar
相关产品推荐
相关产品推荐

