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。预期有效的更新修改器或指定为数组的管道式更新
错误原因与修复方案
- 拼写错误:MongoDB的更新操作符是
$addToSet(驼峰命名,S大写),你写成了$addtoSet(s小写),这是触发错误的直接原因。 - 参数格式错误:若仅添加单个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
相关产品推荐
相关产品推荐

