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
相关产品推荐
相关产品推荐

