Vor kurzem bemerkte ich einen enormen Leistungsunterschied zwischen mehreren Upserts (über Massenoperationen ) vs eine Beilage (mehrere Dokumente). Ich würde gerne wissen, ob ich das richtig mache:
find()
und update()
, so dass es 2 Dinge liest und schreibt Also der Leistungsunterschied?
Wenn das der Fall ist, frage ich mich, ob ich regelmäßig viel schreiben muss, anstatt ein Dokument zu aktualisieren, schreibe ich ein neues Dokument mit einem createdOn
-Feld. Zur Abfrage suche ich dann nach Dokumenten, sortiert nach createdOn DESC
. Ich frage mich, ob das eine gute Methode ist? Oder gibt es einen besseren Weg?
Wenn Ihr Dokument einfügt, muss Mongodb prüfen, ob das Dokument mit der gleichen objectId existiert oder nicht. Wenn es existiert, kann das Dokument nicht eingefügt werden.
Gleicher Fall gilt für Update. Es muss überprüft werden, ob das Dokument existiert oder nicht. Ein anderes Update kann nicht durchgeführt werden. Der Fall, in dem Ihre Aktualisierungsabfrage verlangsamt wird, wenn Sie das Dokument nicht auf der Grundlage Ihres ObjectId / Indexed-Feldes finden.
Else-Leistung zum Einfügen / Aktualisieren des Dokuments sollte gleich sein.
ZB .....
So einfügen kann wie folgt sein // (Fast)
Und Update mit Upsert (ObjectId verfügbar) // (Fast)
Oder Update mit Upsert (ohne ObjectId) // Dies ist langsam
Ich habe keine offizielle Erklärung gefunden, wie ein Upsert in MongoDB funktioniert, aber es ist sicher anzunehmen, dass die Operation darauf abzielt, existierende Dokumente zu aktualisieren und nur ein Dokument hinzuzufügen, wenn das Dokument mit dem angegebenen übereinstimmt Kriterien können nicht gefunden werden.
Wenn Sie einen Index hinzufügen, kann der Upsert schneller werden: Schließlich wird der Index verwendet, um das Dokument zu finden. Der Vorbehalt bezieht sich auf die Felder, auf die der Index angewendet wird, und auf die Felder, die Sie aktualisieren. Wenn der aktualisierte Teil Teil des Indexes ist, wirkt sich dies bei der Aktualisierung des Dokuments auf die Leistung aus. Wenn der aktualisierte Teil nicht Teil des Indexes ist, entsteht keine Strafe für das Schreiben in das vorhandene Dokument. Wenn das Dokument jedoch hinzugefügt wird, haben Sie eine geringe Auswirkung auf die Leistung, da die Indexsammlung aktualisiert wird. Aber trotzdem: Das Hinzufügen eines Dokuments wird schneller bleiben.
Wenn Sie also in Ihrem Szenario wissen, dass Sie Dokumente nicht aktualisieren möchten, sind Einfügungen im Allgemeinen schneller. Wenn Sie sicherstellen möchten, dass Sie das gleiche Dokument nicht zweimal hinzufügen, können Sie auch einen eindeutigen Index hinzufügen. Dann wird ein Einfügen einfach fehlschlagen.
Alles in allem kommt es auf das spezifische Szenario an, aber basierend auf den Informationen, die ich aus Ihrer Frage extrahieren kann, denke ich, ist die beste Option, einfach die Dokumente einzufügen. Da Sie sicherstellen, dass das Feld "createdon" die Dokumente in Ihrem Szenario eindeutig macht, müssen Sie sich nur um die Indizes kümmern, die in Ihren Leseszenarien verwendet werden.
Einige zusätzliche Informationen finden Sie auf der Mongo-Website: Ссылка
Für weitere Informationen zum Entwerfen Ihrer (gelesenen) Indizes finden Sie hier eine ziemlich gute Erklärung, um herauszufinden, ob Ihre Indizes den Abfrageplänen etwas hinzufügen: Ссылка
Ich hoffe, das hilft.
Tags und Links mongodb mongodb-query upsert