Golang MongoDB Driver 更新符合条件的数组元素的字段

在 MongoDB 的 Shell 里修改文档里某个符合条件的数组里的值的字段,可以这样:

db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[<identifier>]" : value } },
   { arrayFilters: [ { <identifier>: <condition> } ] }
)

而在 GoLang 中我们需要使用 MongoDB Driver。

比如有一个 Collection 里每个文档是这样的:

{
      "name": "..",
      "array": []{
            {
                  "name": "a",
                  "detail": "....",
            },
            {
                  "name": "b",
                  "detail": "....",
            }
      }
}

我们要修改 name 为 x 的文档里面 array 里 name 为 b 的记录的 detail 信息为"test"。可以这样写:

filter := bson.M{"name": "x", "array.name": "b"}
update := bson.M{"array.$[item].detail": "test"}
arrayFilter := bson.M{"item.name": "b"}

// coll 是 mongo 的 Collection,下面内容不需要修改。
res := coll.FindOneAndUpdate(context.Background(), 
      filter, 
      bson.M{"$set": update}, 
      options.FindOneAndUpdate().SetArrayFilters(
            options.ArrayFilters{
                  Filters: []interface{}{
                        arrayFilter,
                  },
            },
      ))

if res.Err() != nil {
      // log error      
}
posted @   水郁  阅读(1561)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
历史上的今天:
2016-08-04 【CodeForces 699D】Fix a Tree
2016-08-04 【CodeForces 697C】Lorenzo Von Matterhorn(LCA)
2016-08-04 【HDU 5744】Keep On Movin
2016-08-04 【POJ 2342】Anniversary party(入门树形dp)
欢迎这位怪蜀黍来到《Golang MongoDB Driver 更新符合条件的数组元素的字段 - 水郁 - 博客园》
点击右上角即可分享
微信分享提示