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

MongoDB NestJS使用$addToSet更新数组引用时报错:未知修饰符$addtoSet

使用$addToSet向MongoDB数组添加引用时的错误修复

问题场景

我的Schema定义如下:

@Allow()  
@ApiProperty(GatewaySchemaSwagger.API_PROP_ADMIN_ID)
@Prop({required: true, type: [MongooseSchema.Types.ObjectId] , ref: 'User' })
admin: [User];

集合中的现有数据:

{
"_id" : ObjectId("63c022bfd2d744ebaffe3412"),
"buttons" : [],
"admin" : [ 
    ObjectId("636bc633ccc1e71aa32ad831")
],
"user" : ObjectId("636bc633ccc1e71aa32ad831"),
"channelId" : "1",    
}

执行的更新代码:

let findUser = await this.usersService.findByEmail(data.email);
await this.GatewayModel.findOneAndUpdate({ admin: userId, channelId: channelId }, { $addtoSet: { "admin": [findUser._id]  } })

出现的错误(已翻译):

未知的修改器:$addtoSet。预期有效的更新修改器或指定为数组的管道式更新

错误原因与修复方案

  1. 拼写错误:MongoDB的更新操作符是$addToSet(驼峰命名,S大写),你写成了$addtoSet(s小写),这是触发错误的直接原因。
  2. 参数格式错误:若仅添加单个ObjectId到数组,无需用数组包裹findUser._id,否则会把整个数组作为单个元素插入到admin数组中,不符合需求。

修正后的代码:

let findUser = await this.usersService.findByEmail(data.email);
await this.GatewayModel.findOneAndUpdate(
  { admin: userId, channelId: channelId }, 
  { $addToSet: { "admin": findUser._id } }
)

补充说明

如果需要一次性添加多个元素到数组,可结合$each操作符使用$addToSet,示例:

await this.GatewayModel.findOneAndUpdate(
  { admin: userId, channelId: channelId }, 
  { $addToSet: { "admin": { $each: [id1, id2, id3] } } }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:40:24