When using MongoDB, sometimes we need to update multiple records based on different keys, which can be confusing. However, fortunately in MongoDB, we can use the Bulk Write operation to achieve this goal. Bulk Write is a bulk write operation that can perform multiple update, insert, or delete operations in a single operation. In this article, I will introduce you to how to use Bulk Write to update multiple records based on different keys in Mongo.
If I had something similar to the following...
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" }, } )
Is it possible to apply the following updates in an insertmany query?
[{"_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"}]
If so, how would it be done using golang?
Specifically, using collection.updatemany(context.todo(), filter, update)
, what will happen to my filter
and update
?
thanks for your help.
You can't do this with a collection.updatemany()
call because you can't match different documents Apply different update documents. You must call collection.updatemany()
multiple times, once for each different update document.
If you want to do this efficiently with a single call, you can use collection.bulkwrite()
. You must prepare a different mongo.writemodel
for each document update.
It might look like this:
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"}}), }
There are too many "repetitions" in the slice literal above, you can use a helper function to capture them:
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"), }
Also, if there is logic in the update that can be easily defined, use a loop instead of listing all elements:
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}}), ) }
You can perform all updates with a single call like this:
res, err := coll.BulkWrite(ctx, wm)
View related content: mongodb updates the document array and replaces it with the replacement document array
The above is the detailed content of How to update multiple records in one query based on different keys in Mongo?. For more information, please follow other related articles on the PHP Chinese website!