Heim > Backend-Entwicklung > Golang > Wie aktualisiere ich mehrere Datensätze in einer Abfrage basierend auf unterschiedlichen Schlüsseln in Mongo?

Wie aktualisiere ich mehrere Datensätze in einer Abfrage basierend auf unterschiedlichen Schlüsseln in Mongo?

PHPz
Freigeben: 2024-02-15 11:51:08
nach vorne
685 Leute haben es durchsucht

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

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.

Frageninhalt

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" },
} )
Nach dem Login kopieren

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"}]
Nach dem Login kopieren

Wenn ja, wie würde dies mit Golang erreicht werden?

Was würde konkret passieren, wenn Sie collection.updatemany(context.todo(), filter, update),我的 filterupdate verwenden?

Danke für deine Hilfe.

Problemumgehung

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.writemodelUpdate 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"}}),
}
Nach dem Login kopieren

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"),
}
Nach dem Login kopieren

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}}),
    )
}
Nach dem Login kopieren

Sie können alle Updates mit einem einzigen Aufruf wie folgt durchführen:

res, err := coll.BulkWrite(ctx, wm)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage