登录
首页 >  Golang >  Go问答

使用 MongoDB 更新文档数组并替换原有数组

来源:stackoverflow

时间:2024-02-29 08:33:25 306浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《使用 MongoDB 更新文档数组并替换原有数组》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

是否可以通过替换字段(文档)数组使用 mongodb 批量更新(更新插入)文档数组?

基本上是为了摆脱这个伪代码示例中的 for 循环:

for user in users {
  db.users.replaceone(
      { "name" : user.name },
      user,
      { "upsert": true }
}

updatemany 文档仅记录以下所有文档都以相同方式更新的情况:

db.collection.updatemany(
   ,
   { $set: { status: "d" }, $inc: { quantity: 2 } },
   ...
)

我正在尝试更新(更新插入)文档数组,其中每个文档都有自己的一组替换字段:

updateoptions := options.updateoptions{}
updateoptions.setupsert(true)
updateoptions.setbypassdocumentvalidation(false)
_, error := collection.col.updatemany(ctx, bson.m{"name": bson.m{"$in": names}}, bson.m{"$set": users}, &updateoptions)

其中 users 是文档数组:

[
{ "name": "A", ...further fields},
{ "name": "B", ...further fields},
...
]

显然,$set 不能用于这种情况,因为我收到以下错误:批量写入 *v1.usercollection (failedtoparse) 修饰符对字段进行操作时出错,但我们发现类型为数组。

非常感谢任何帮助!


正确答案


您可以使用Collection.BulkWrite()

由于您希望以不同的方式更新每个文档,因此必须为每个文档更新准备不同的 mongo.WriteModel

您可以使用 mongo.ReplaceOneModel 进行个别文档替换。您可以像这样构建它们:

wm := make([]mongo.writemodel, len(users)
for i, user := range users {
    wm[i] = mongo.newreplaceonemodel().
        setupsert(true).
        setfilter(bson.m{"name": user.name}).
        setreplacement(user)
}

您可以通过一次调用执行所有替换,如下所示:

res, err := coll.BulkWrite(ctx, wm)

是的,这里我们也有一个循环,但那是准备我们想要执行的写入任务。所有这些都通过一次调用发送到数据库,并且如果可能的话,数据库可以“自由”地并行执行它们。这可能比单独为每个文档调用 Collection.ReplaceOne() 快得多。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>