You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:05:22