Bei der Verwendung von MongoDB müssen wir manchmal mehrere Datensätze basierend auf unterschiedlichen Schlüsseln aktualisieren, und dieses Problem kann verwirrend sein. Glücklicherweise können wir in MongoDB jedoch die Bulk-Write-Operation verwenden, um dieses Ziel zu erreichen. Bulk Write ist ein Massenschreibvorgang, der mehrere Aktualisierungs-, Einfüge- oder Löschvorgänge in einem einzigen Vorgang ausführen kann. In diesem Artikel stelle ich Ihnen vor, wie Sie mit Bulk Write mehrere Datensätze basierend auf unterschiedlichen Schlüsseln in Mongo aktualisieren.
Wenn ich etwas Ähnliches wie das Folgende habe ...
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" }, } )
Ist es möglich, die folgenden Aktualisierungen in einer insertmany-Abfrage anzuwenden?
[{"_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"}]
Wenn ja, wie würde dies mit Golang erreicht werden?
Was würde konkret passieren, wenn Sie collection.updatemany(context.todo(), filter, update)
,我的 filter
和 update
verwenden?
Danke für deine Hilfe.
Sie können dies nicht mit einem collection.updatemany()
调用,因为您无法对不同的匹配文档应用不同的更新文档。您必须多次调用 collection.updatemany()
tun, einem für jedes unterschiedliche Aktualisierungsdokument.
Wenn Sie dies effizient mit einem einzigen Aufruf erledigen möchten, können Sie collection.bulkwrite()
。您必须准备一个不同的 mongo.writemodel
Update pro Dokument verwenden.
Es könnte so aussehen:
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"}}), }
Es gibt zu viele „Wiederholungen“ im Slice-Literal oben, Sie können sie mit einer Hilfsfunktion erfassen:
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"), }
Wenn das Update eine Logik enthält, die leicht definiert werden kann, verwenden Sie außerdem eine Schleife, anstatt alle Elemente aufzulisten:
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}}), ) }
Sie können alle Updates mit einem einzigen Aufruf wie folgt durchführen:
res, err := coll.BulkWrite(ctx, wm)
Zugehörige Inhalte anzeigen: mongodb Dokumentarray aktualisieren und durch Dokumentarray ersetzen ersetzen
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich mehrere Datensätze in einer Abfrage basierend auf unterschiedlichen Schlüsseln in Mongo?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!