2017-04-27 2 views
2

Angenommen, ich möchte das gesamte Dokument aktualisieren und alle Felder mit Ausnahme von _id überschreiben. Was der drei Methoden ist die beste in Bezug auf Ressourcenverbrauch:Was ist der schnellste Weg, um das gesamte Dokument (alle Felder) in MongoDB zu aktualisieren?

1. Stellen Sie das komplette Dokument als Update-Parameter, so dass alle Felder

Beispiel übergeben werden:

collection.update({_id: docId}, {$set:updateDoc}); 

2 Ein Delta-Dokument zwischen dem Original und dem updateDoc berechnen

Beispiel:

const originalDoc = collection.findOne(docId); 
const deltaDoc = calculateDeltaFct(originalDoc, updateDoc); //get changed fields 
collection.update({_id: docId}, {$set:deltaDoc}); 

3. Verwenden Sie die Mongo 3.2. replaceOne function

Beispiel:

collection.replaceOne({_id: docId}, {$set:updateDoc}); 

Ich habe eine Annahme der Vor- und die Nachteile der einzelnen Methoden, aber ich will sicher sein, was zu wählen und warum. Ich bin mir nicht sicher, wie man es genau misst, also kann vielleicht jemand helfen.

Hintergrund:

ich eine Metrik Sammlung haben, wo viele Dokumente häufig aktualisiert werden, aber die Felder aktualisiert sehr unterschiedlich sein werden, so dass es schwierig ist, ein Update-Methode für jedes Feld zu schreiben. Stattdessen beabsichtige ich einfach, alle Daten zu übertragen und alle Felder zu aktualisieren, sodass ich meinen Code mit nur einer Update-Methode für alle Updates sauber halte.

Update:

In meinem Setup gibt es keine Unterdokumente in der Dokumentstruktur eingebettet. Ich habe auch keine Sharding und Replikation in meinem (Dev) Setup.

Außerdem habe ich eine Methode (collection.explain) gefunden, mit der ich auch zu diesem Thema recherchieren werde. Trotzdem wird jede Hilfe oder jeder Hinweis sehr geschätzt.

Antwort

1

Es hängt wirklich davon ab, ob Sie die alten Informationen vor dem Update benötigen. Wenn Sie die Info und sogar für einen Schlüssel überschreiben -> Wert-Paar dann würde ich entweder update oder replaceOne verwenden. Der Unterschied kann abhängig von der Größe Ihrer Sammlung (Datensatz) sein. Wenn das bedenklich ist, benchmarken Sie den Unterschied. Persönlich würde ich mich zu replaceOne neigen, aber das basiert nur auf Erfahrung und den Sammlungen, mit denen ich mich beschäftige.

Für das, was Sie erklärt haben, glaube ich nicht, dass Ihre zweite Wahl entweder effizient oder Gedächtnis-versiert ist. Es klingt nicht so, als ob Sie eine solche Berechnung benötigen, um einfach Daten zu aktualisieren, bei denen keine Bedenken bestehen, die vorherigen Informationen zu überschreiben.

Verwandte Themen