Inhaltsverzeichnis
Frageninhalt
Problemumgehung
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?

Feb 15, 2024 am 11:51 AM
overflow

如何在一个查询中根据 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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Ist die H5-Seitenproduktion eine Front-End-Entwicklung? Apr 05, 2025 pm 11:42 PM

Ja, die H5-Seitenproduktion ist eine wichtige Implementierungsmethode für die Front-End-Entwicklung, die Kerntechnologien wie HTML, CSS und JavaScript umfasst. Entwickler bauen dynamische und leistungsstarke H5 -Seiten auf, indem sie diese Technologien geschickt kombinieren, z. B. die Verwendung der & lt; canvas & gt; Tag, um Grafiken zu zeichnen oder JavaScript zu verwenden, um das Interaktionsverhalten zu steuern.

Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Apr 05, 2025 pm 02:30 PM

Die Methode zur Anpassung der Größe der Größe der Größe der Größe in CSS ist mit Hintergrundfarben einheitlich. In der täglichen Entwicklung begegnen wir häufig Situationen, in denen wir die Details der Benutzeroberfläche wie Anpassung anpassen müssen ...

Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Der jüngste Preis für Bitcoin in den Jahren 2018-2024 USD Feb 15, 2025 pm 07:12 PM

Echtzeit-Bitcoin-USD-Preis Faktoren, die den Bitcoin -Preis beeinflussen Indikatoren für die Vorhersage zukünftiger Bitcoin -Preise Hier finden Sie einige wichtige Informationen zum Preis von Bitcoin in den Jahren 2018-2024:

Warum sind die Inline-Block-Elemente falsch ausgerichtet? Wie löst ich dieses Problem? Warum sind die Inline-Block-Elemente falsch ausgerichtet? Wie löst ich dieses Problem? Apr 04, 2025 pm 10:39 PM

In Bezug auf die Gründe und Lösungen für falsch ausgerichtete Darstellung von Inline-Block-Elementen. Beim Schreiben von Webseitenlayout stoßen wir oft auf einige scheinbar seltsame Anzeigenprobleme. Vergleichen...

Wie steuern Sie die obere und das Ende der Seiten in den Browser -Druckeinstellungen über JavaScript oder CSS? Wie steuern Sie die obere und das Ende der Seiten in den Browser -Druckeinstellungen über JavaScript oder CSS? Apr 05, 2025 pm 10:39 PM

So verwenden Sie JavaScript oder CSS, um die obere und das Ende der Seite in den Druckeinstellungen des Browsers zu steuern. In den Druckeinstellungen des Browsers gibt es eine Option, um zu steuern, ob das Display ist ...

Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Wie verwendet ich das Clip-Pfad-Attribut von CSS, um den 45-Grad-Kurveneffekt des Segmenters zu erreichen? Apr 04, 2025 pm 11:45 PM

Wie kann man den 45-Grad-Kurveneffekt des Segmenters erreichen? Bei der Implementierung des Segmenters verwandeln Sie den rechten Rand in eine 45-Grad-Kurve, wenn Sie auf die linke Schaltfläche klicken, und der Punkt ...

Wie kann man Segmentierungseffekt mit einer 45 -Grad -Kurvenrandung erreichen? Wie kann man Segmentierungseffekt mit einer 45 -Grad -Kurvenrandung erreichen? Apr 04, 2025 pm 11:48 PM

Tipps zur Implementierung von Segmentierereffekten im Design der Benutzeroberfläche sind Segmentierer ein gemeinsames Navigationselement, insbesondere in mobilen Anwendungen und reaktionsschnellen Webseiten. ...

Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Apr 05, 2025 pm 11:00 PM

Das Problem der Containeröffnung aufgrund einer übermäßigen Auslassung von Text unter Flex -Layout und Lösungen werden verwendet ...

See all articles