Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
PHPzke hadapan
2024-02-15 11:51:08663semak imbas

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

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"}]

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

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

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}}),
    )
}

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

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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam