MongoDB updateOne报“Expected 2-3 arguments but got 4”错误怎么解决?
解决MongoDB updateOne参数错误及返回文档的问题
错误原因分析
你遇到的Expected 2 - 3 arguments but got 4错误,根源是两个问题:
- 同时混用了
await(Promise异步写法)和回调函数,导致多传了一个参数——updateOne最多只接受3个参数:查询条件、更新操作、配置选项 - 用错了方法:
updateOne不支持new: true选项,而且它不会返回目标文档,只会返回操作的统计结果(比如匹配数、修改数)
正确解决方案
如果核心需求是拿到插入的新文档或匹配的现有文档,改用findOneAndUpdate;如果只需要确认操作结果,就修正updateOne的调用方式。
方案1:获取插入/匹配的文档(推荐)
使用findOneAndUpdate,配置upsert: true实现“存在则更新,不存在则插入”,再用returnDocument: 'after'指定返回更新后的(或新插入的)文档:
const doc = await users.findOneAndUpdate( { address }, { $set: { address, referralCode } }, { upsert: true, returnDocument: 'after' } // MongoDB 4.2+版本用这个;旧版本可替换为new: true ); console.log(doc); // 这里就是你要的目标文档
方案2:仅获取操作统计结果(用updateOne)
如果不需要拿到文档,只需要确认操作状态,去掉多余的回调函数即可:
const result = await users.updateOne( { address }, { $set: { address, referralCode } }, { upsert: true } ); // 打印操作统计信息 console.log(`匹配${result.matchedCount}个文档,修改${result.modifiedCount}个文档,是否插入新文档:${result.upsertedId ? '是' : '否'}`);
内容的提问来源于stack exchange,提问作者Benito
相关产品推荐
相关产品推荐

