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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:30:08