Home  >  Article  >  Backend Development  >  How to update multiple records in one query based on different keys in Mongo?

How to update multiple records in one query based on different keys in Mongo?

PHPz
PHPzforward
2024-02-15 11:51:08625browse

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

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.

Question content

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.

Workaround

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete