MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Sollten Sie ein Dokument vorab zuweisen, wenn Sie $addToSet oder $push verwenden?

Es wird empfohlen, wenn es für den Anwendungsfall machbar ist, was normalerweise nicht der Fall ist. Zeitreihendaten sind eine bemerkenswerte Ausnahme. Es trifft nicht wirklich auf $addToSet zu und $push weil sie dazu neigen, die Größe des Dokuments zu erhöhen, indem sie ein Array vergrößern.

Halt. Sind Sie sicher, dass Sie ständig wachsende Arrays mit Zehntausenden von Einträgen wollen? Wollen Sie bestimmte Einträge zurückfragen? Werden Sie Felder in den Array-Einträgen indizieren? Wahrscheinlich möchten Sie Ihre Dokumentenstruktur überdenken. Vielleicht möchten Sie alle data Eintrag als separates Dokument mit Feldern wie market , type , createdAt jeweils repliziert? Sie müssten sich keine Gedanken über Dokumentverschiebungen machen.

Warum wird das Array auf 75.000 Einträge anwachsen? Können Sie weniger Einträge pro Dokument machen? Sind das Zeitreihendaten ? Es ist großartig, mit der mmap-Speicher-Engine Dokumente vorab zuordnen und In-Place-Updates durchführen zu können, aber es ist nicht für jeden Anwendungsfall machbar und keine Voraussetzung für eine gute Leistung von MongoDB.

Nein, das ist nicht wirklich hilfreich. Die Dokumentgröße wird basierend auf der BSON-Größe der Nullwerte im Array berechnet, also wenn Sie null ersetzen bei einem anderen Typ nimmt die Größe zu und Sie erhalten trotzdem Dokumentumschreibungen. Sie müssten das Array mit Objekten vorbelegen, wobei alle Felder auf einen Standardwert für seinen Typ gesetzt sind, z. B.

{
    "date" : ISODate("1970-01-01T00:00:00Z")    // use a date type instead of a string date
    "price" : 0,
    "amount" : 0,
    "tid" : "000000", // assuming 7 character code - strings icky for default preallocation
    "type" : "none"    // assuming it's "buy" or "sell", want a default as long as longest real values
}