在使用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)
,我的 filter
和 update
會有什麼?
感謝您的幫忙。
你不能用一個來做到這一點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中文網其他相關文章!