最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何在一个查询中根据 Mongo 中的不同键更新多条记录?

    如何在一个查询中根据 mongo 中的不同键更新多条记录?

    在使用MongoDB时,有时我们需要根据不同的键来更新多条记录,这个问题可能会让人感到困惑。不过,幸好在MongoDB中,我们可以使用Bulk Write操作来实现这个目标。Bulk Write是一种批量写入操作,可以在单个操作中执行多个更新、插入或删除操作。在这篇文章中,我将向大家介绍如何使用Bulk Write来根据Mongo中的不同键更新多条记录。

    问题内容

    如果我有类似于以下内容的内容…

    collection.insertmany(context.todo(), []interface{}{
       bson.m{ "_id" : 1, "member" : "abc123", "status" : "p" },
       bson.m{ "_id" : 2, "member" : "xyz123", "status" : "a" },
       bson.m{ "_id" : 3, "member" : "lmn123", "status" : "p" },
       bson.m{ "_id" : 4, "member" : "pqr123", "status" : "d" },
       bson.m{ "_id" : 5, "member" : "ijk123", "status" : "p" },
       bson.m{ "_id" : 6, "member" : "cde123", "status" : "a" },
    } )

    是否可以在一个 insertmany 查询中应用以下更新?

    [{"_id" : "1", "status" : "P0-A0"},
     {"_id" : "2", "status" : "P0-A1"},
     {"_id" : "3", "status" : "P0-A2"},
     {"_id" : "4", "status" : "P0-A3"},
     {"_id" : "5", "status" : "P0-A4"},
     {"_id" : "6", "status" : "P0-A5"}]

    如果是这样,用 golang 会如何完成?

    具体来说,使用 collection.updatemany(context.todo(), filter, update),我的 filterupdate 会有什么?

    感谢您的帮助。

    解决方法

    你不能用一个来做到这一点collection.updatemany() 调用,因为您无法对不同的匹配文档应用不同的更新文档。您必须多次调用 collection.updatemany(),每个不同的更新文档一次。

    如果您想通过一次调用高效地完成此操作,您可以使用 collection.bulkwrite()。您必须准备一个不同的 mongo.writemodel每个文档更新。

    它可能是这样的:

    wm := []mongo.writemodel{
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "1"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a0"}}),
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "2"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a1"}}),
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "3"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a2"}}),
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "4"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a3"}}),
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "5"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a4"}}),
        mongo.newupdateonemodel().setfilter(bson.m{"_id": "6"}).setupdate(bson.m{"$set": bson.m{"status": "p0-a5"}}),
    }

    上面的切片文字中有太多“重复”,您可以使用辅助函数捕获它们:

    create := func(id, newstatus string) *mongo.updateonemodel {
        return mongo.newupdateonemodel().
            setfilter(bson.m{"_id": id}).
            setupdate(bson.m{"$set": bson.m{"status": newstatus}})
    }
    
    wm := []mongo.writemodel{
        create("1", "p0-a0"),
        create("2", "p0-a1"),
        create("3", "p0-a2"),
        create("4", "p0-a3"),
        create("5", "p0-a4"),
        create("6", "p0-a5"),
    }

    此外,如果更新中有可以轻松定义的逻辑,请使用循环而不是列出所有元素:

    var wm []mongo.writemodel
    for i := 1; i <= 6; i++ {
        newstatus := fmt.sprintf("p0-a%d", i-1)
        wm = append(wm, mongo.newupdateonemodel().
            setfilter(bson.m{"_id": strconv.itoa(i)}).
            setupdate(bson.m{"$set": bson.m{"status": newstatus}}),
        )
    }

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

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

    查看相关内容:mongodb 更新文档数组并替换为替换文档数组

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何在一个查询中根据 Mongo 中的不同键更新多条记录?
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情