Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk mengemas kini berbilang rekod dalam satu pertanyaan berdasarkan kunci berbeza dalam Mongo?

Bagaimana untuk mengemas kini berbilang rekod dalam satu pertanyaan berdasarkan kunci berbeza dalam Mongo?

PHPz
Lepaskan: 2024-02-15 11:51:08
ke hadapan
730 orang telah melayarinya

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

Apabila menggunakan MongoDB, kadangkala kita perlu mengemas kini berbilang rekod berdasarkan kekunci yang berbeza, dan masalah ini boleh mengelirukan. Walau bagaimanapun, mujurlah dalam MongoDB, kami boleh menggunakan operasi Tulis Pukal untuk mencapai matlamat ini. Tulis Pukal ialah operasi tulis pukal yang boleh melakukan pelbagai operasi kemas kini, sisipan atau pemadaman dalam satu operasi. Dalam artikel ini, saya akan memperkenalkan anda cara menggunakan Tulis Pukal untuk mengemas kini berbilang rekod berdasarkan kekunci berbeza dalam Mongo.

Kandungan soalan

Jika saya mempunyai sesuatu yang serupa dengan yang berikut...

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" },
} )
Salin selepas log masuk

Adakah mungkin untuk menggunakan kemas kini berikut dalam pertanyaan sisipan banyak?

[{"_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"}]
Salin selepas log masuk

Jika ya, bagaimanakah ia boleh dicapai menggunakan golang?

Secara khusus, apa yang akan berlaku jika anda menggunakan collection.updatemany(context.todo(), filter, update),我的 filterupdate?

Terima kasih atas bantuan anda.

Penyelesaian

Anda tidak boleh melakukan ini dengan satu collection.updatemany() 调用,因为您无法对不同的匹配文档应用不同的更新文档。您必须多次调用 collection.updatemany(), satu untuk setiap dokumen kemas kini yang berbeza.

Jika anda ingin melakukan ini dengan cekap dengan satu panggilan, anda boleh menggunakan collection.bulkwrite()。您必须准备一个不同的 mongo.writemodelKemas kini setiap dokumen.

Ia mungkin kelihatan seperti ini:

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"}}),
}
Salin selepas log masuk

Terlalu banyak "pengulangan" dalam kepingan literal di atas, anda boleh menangkapnya menggunakan fungsi pembantu:

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"),
}
Salin selepas log masuk

Selain itu, jika terdapat logik dalam kemas kini yang boleh ditakrifkan dengan mudah, gunakan gelung dan bukannya menyenaraikan semua elemen:

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}}),
    )
}
Salin selepas log masuk

Anda boleh melakukan semua kemas kini dengan satu panggilan seperti ini:

res, err := coll.BulkWrite(ctx, wm)
Salin selepas log masuk

Lihat kandungan berkaitan: mongodb kemas kini tatasusunan dokumen dan gantikan dengan ganti tatasusunan dokumen

Atas ialah kandungan terperinci Bagaimana untuk mengemas kini berbilang rekod dalam satu pertanyaan berdasarkan kunci berbeza dalam Mongo?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan