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

PHPz
Release: 2024-02-15 11:51:08
forward
670 people have browsed it

如何在一个查询中根据 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" },
} )
Copy after login

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"}]
Copy after login

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"}}),
}
Copy after login

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"),
}
Copy after login

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}}),
    )
}
Copy after login

You can perform all updates with a single call like this:

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

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template