Go操作MongoDB时,同一顶级字段用多arrayFilters报错的解决办法
解决MongoDB arrayFilters同一顶级字段重复的问题
你遇到的错误是因为MongoDB不允许在arrayFilters中使用多个带有相同顶级字段名(这里是x)的过滤器。正确的做法是把针对同一个占位符的多个条件合并到同一个过滤器对象中,而不是拆分成多个独立的过滤器。
修改后的代码
filter := bson.D{primitive.E{Key: "_id", Value: e.EventId}} // 将两个条件合并到同一个array filter中 arrayFilters := options.ArrayFilters{ Filters: []interface{}{ bson.M{ "x._id": tt.TypeId, "x.typeAmountUsed": bson.M{"$lt": "$x.typeAmount"}, }, }, } upsert := true opts := options.UpdateOptions{ ArrayFilters: &arrayFilters, Upsert: &upsert, } update := bson.M{ "$inc": bson.D{{"eventTicketTypes.$[x].typeAmountUsed", 1}}, } if _, err = events.UpdateOne(sessCtx, filter, update, &opts); err != nil { return nil, err }
逻辑说明
合并后的过滤器会同时校验两个条件:
- 数组元素的
_id等于tt.TypeId - 该元素的
typeAmountUsed小于自身的typeAmount
只有同时满足这两个条件的数组元素,才会被执行$inc操作,既避免了重复占位符的错误,也实现了你需要的业务逻辑。
内容的提问来源于stack exchange,提问作者Daan van de Haar
相关产品推荐
相关产品推荐

