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

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
}

逻辑说明

合并后的过滤器会同时校验两个条件:

  1. 数组元素的_id等于tt.TypeId
  2. 该元素的typeAmountUsed小于自身的typeAmount

只有同时满足这两个条件的数组元素,才会被执行$inc操作,既避免了重复占位符的错误,也实现了你需要的业务逻辑。

内容的提问来源于stack exchange,提问作者Daan van de Haar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:20:26