首頁 > 後端開發 > Golang > 主體

如何在一個查詢中根據 Mongo 中的不同鍵更新多筆記錄?

PHPz
發布: 2024-02-15 11:51:08
轉載
671 人瀏覽過

如何在一个查询中根据 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 更新文件數組並替換為替換文檔數組

以上是如何在一個查詢中根據 Mongo 中的不同鍵更新多筆記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板