2015-06-17 8 views
6

Ich verwende den MongoDB .Net-Treiber in meinem Projekt. Ich möchte alle Eigenschaften meines Objekts, das in MongoDB gespeichert ist, aktualisieren. In der Dokumentation wird, Update wie folgt dargestellt:Aktualisieren Sie alle Eigenschaften des Objekts in MongoDb

var filter = Builders<BsonDocument>.Filter.Eq("i", 10); 
var update = Builders<BsonDocument>.Update.Set("i", 110); 

await collection.UpdateOneAsync(filter, update); 

Aber ich will nicht die Set Methode für alle Eigenschaften nennen, da es viele Objekte sind und viele mehr in der Zukunft sein kann.

Wie kann ich das gesamte Objekt mit dem MongoDB .Net-Treiber aktualisieren?

+0

Yon verwenden nur [** '$ Set' **] (http://docs.mongodb.org/manual/reference/operator/update/set/) und den dazugehörigen Operatoren (die alle diese Treiber-Builder tun) auf den Feldern, die Sie tatsächlich aktualisieren möchten. Wenn Sie also nur einen ändern müssen, listen Sie einen auf. Ist das dein Problem oder willst du 20 von 50 Eigenschaften in deinem Update ändern? –

+0

@ user3561036 Anzahl der aktualisierten Eigenschaften sind unbekannt, also bin ich ok mit der Aktualisierung von allen auf einmal, auch ist der Wert immer noch der gleiche. – Sefa

+0

Das ist im Grunde ein "Update-Dokument" ohne irgendwelche Operatoren wie $ set. Aber es gibt eine praktische Hilfsmethode, die das für Sie erledigt, anstatt nur das gesamte Dokument zu serialisieren. –

Antwort

12

Sie können das mit ReplaceOneAsync statt UpdateOneAsync tun.

Sie benötigen einen Filter, um das vorhandene Dokument (ein Filter mit der Dokument-ID ist die einfachste) und das neue Objekt.

Hamster hamster = ... 
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster); 
+1

Aber wie gebe ich ihnen die gleichen IDs, ohne zuerst eine zusätzliche Anfrage an die Datenbank für die bereits vorhandene ID zu senden? Fehle ich hier etwas? – Reynevan

+0

@Reynevan 1. Sie können die ID von der DB erhalten. 2. Sie können die ID selbst im Code erstellen. – i3arnon

+0

In meinem Szenario erstelle ich Objekte und füge sie dann zu einer Datenbank hinzu. Wenn ich die App das nächste Mal starte, gibt es keine Garantie, dass die erstellten Objekte nicht schon da sind. Wenn ich versuche, sie hochzuladen, haben sie keine passenden '_id's. Wenn ich die ID von der DB bekomme, ist das eine zusätzliche Anfrage an die DB. Ich habe ~ 800 Objekte pro Batch. Das scheint nicht so effizient zu sein. – Reynevan

-2
var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null))))); 
var options = new UpdateOptions(); 
collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options); 
+0

Bitte kommentieren Sie Ihren Code. Sie müssen erklären, warum Ihre Antwort gut ist. – JorgeHortelano

Verwandte Themen