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

Mongoose执行查询报Can't use $or错误但同语句Mongo Shell运行正常求助

问题原因

findByIdAndUpdate是Mongoose封装的语法糖,它的第一个参数要求只能传入_id的具体值(字符串、ObjectId类型均可),方法内部会自动把参数包装为{_id: 传入值}的查询条件。你现在直接给第一个参数传了包含_id、$or的完整查询对象,Mongoose会尝试把整个对象强制转换为ObjectId类型,转换过程中识别到$or操作符就抛出了异常。
而Mongo Shell里你用的是原生的findOneAndUpdate,这个方法本身就接收完整查询条件,所以能正常执行。

解决方案

方案1:改用findOneAndUpdate方法(推荐)

如果需要携带除_id之外的其他查询条件,直接使用和Shell逻辑一致的findOneAndUpdate即可:

const edit = await Posts.findOneAndUpdate(
  {
    _id: postId,
    $or: [
      { type: "blog" },
      { author: 123 },
    ],
  },
  {
    $set: {
      content:"...new"
    },
  },
  // 若需要返回更新后的文档,可开启下面的参数
  // { new: true }
);

方案2:保持用findByIdAndUpdate,把其他条件放到options配置中

该写法可读性较差,仅做参考:

const edit = await Posts.findByIdAndUpdate(
  postId,
  { $set: { content: "...new" } },
  {
    conditions: {
      $or: [
        { type: "blog" },
        { author: 123 },
      ]
    }
  }
);

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:04