Mongoose updateOne()无法传入options参数报错求助
Mongoose 8.0.3 updateOne传参报错解决
问题描述
调用文档实例的updateOne时传入3个参数,触发TypeScript错误:Expected 0-2 arguments, but got 3.ts(2554),代码示例如下:
const guild = await guildSchema.findOne({ id: interaction.guildId }) await guild?.updateOne( { id: interaction.user.id }, { $set: { "some.value": true } }, { arrayFilters: [ { "i.recipe": "Fried rice", "i.item": { $not: { $regex: "oil" } }, } ] } )
用户参照官方文档中Query.prototype.updateOne的参数说明(支持filter、update、options、callback四个参数),但实际代码仍报错。
问题原因
你混淆了Model的updateOne方法和文档实例的updateOne方法的参数规则:
- Model的
updateOne(对应Query.prototype.updateOne):需要传入filter指定匹配文档,参数顺序为filter, update, options, callback - 文档实例的
updateOne(Document.prototype.updateOne):实例已绑定具体文档,无需传入filter,参数顺序为update, options, callback,最多接受2个非回调参数
你当前代码是调用文档实例的updateOne,却传入了Model方法的参数格式,导致参数数量不匹配报错。
解决方案
方案1:直接调用Model的updateOne方法
无需先查询文档,直接通过Model执行更新,可完整传入filter、update、options参数:
await guildSchema.updateOne( // 合并原有的guildId和user.id过滤条件 { id: interaction.guildId, "some.id": interaction.user.id }, { $set: { // 使用占位符$[i]关联arrayFilters "some.$[i].value": true } }, { arrayFilters: [ { "i.recipe": "Fried rice", "i.item": { $not: { $regex: "oil" } } } ] } )
方案2:调整文档实例的updateOne参数
去掉多余的filter参数,仅传入update和options:
const guild = await guildSchema.findOne({ id: interaction.guildId }) await guild?.updateOne( { $set: { // 使用占位符$[i]关联arrayFilters "some.$[i].value": true } }, { arrayFilters: [ { "i.recipe": "Fried rice", "i.item": { $not: { $regex: "oil" } } } ] } )
注意:使用
arrayFilters时,update操作中必须通过$[占位符名称]指定要匹配的数组元素,否则arrayFilters不会生效,原代码中的"some.value"写法无法正确关联数组过滤条件。
内容的提问来源于stack exchange,提问作者Lingen
相关产品推荐
相关产品推荐

