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

Sollte ich einen Sparse-Index für boolesche Flags in Mongodb verwenden?

Die spärliche Flagge ist ein wenig seltsam. Um zu verstehen, wann es verwendet wird, müssen Sie verstehen, warum "sparse" überhaupt existiert.

Wenn Sie einen einfachen Index für ein Feld erstellen, gibt es einen Eintrag für jedes Dokument, sogar für Dokumente, die dieses Feld nicht haben.

Wenn Sie beispielsweise einen Index für {rarely_set_field : 1} haben , haben Sie einen Index, der hauptsächlich mit null gefüllt ist da dieses Feld in den meisten Fällen nicht vorhanden ist. Das ist Platzverschwendung und die Suche ist ineffizient.

Der {sparse:true} Option wird null los Werte, sodass Sie einen Index erhalten, der nur Einträge enthält, wenn {rarely_set_field} ist definiert.

Zurück zu Ihrem Fall.

Sie fragen nach der Verwendung eines Boolean + Sparse. Aber Sparse wirkt sich nicht wirklich auf "boolean" aus, Sparse beeinflusst "ist gesetzt vs. ist nicht gesetzt".

In Ihrem Fall versuchen Sie, unfinished abzurufen . Um sparse zu nutzen Entscheidend ist nicht der boolesche Wert, sondern die Tatsache, dass unfinished Einträge haben diesen Schlüssel und "fertige" Einträge haben überhaupt keinen Schlüssel.

{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished

Es klingt, als würden Sie eine Warteschlange verwenden

Sie können die obigen Informationen definitiv nutzen, um einen Sparse-Index zu implementieren. Es klingt jedoch tatsächlich so, als würden Sie eine Warteschlange verwenden. MongoDB kann als Warteschlange verwendet werden, hier sind zwei Beispiele .

Wenn Sie sich jedoch die Warteschlange ansehen, machen sie es nicht so, wie Sie es tun. Ich persönlich verwende MongoDB als Warteschlange für einige Produktionssysteme und es läuft ziemlich gut, aber testen Sie Ihre erwartete Last, da eine dedizierte Warteschlange viel besser abschneiden wird.