Heim  >  Artikel  >  Backend-Entwicklung  >  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
PHPznach vorne
2024-02-15 11:51:08626Durchsuche

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen