Frage

Ich habe einen Katalog mit Produkten und möchte ihn nach vielen Parametern filtern: Kategorie, Preis, Größe, Farbe, Gewicht usw.

Die Frage betrifft also die Indizierung.

Ich kann versuchen, den zusammengesetzten Index für alle Felder zu verwenden und sie in derselben Reihenfolge abzufragen, in der ich sie indiziert habe. Aber was ist, wenn ich nur nach Größe und Farbe und dann nur nach Preis und Gewicht filtern muss? Das Erstellen eines zusammengesetzten Index für jede mögliche Filterabfrage wäre übertrieben, da möglicherweise zu viele Parameter vorhanden sind.

Nach einiger Suche fand ich einen interessanten Ansatz

Dort wird empfohlen, "normalisierte Attribute" zu verwenden:

{color: "red"} = 10
{weight: 125} = 25
{size: "M"} = 30

und jetzt sieht Mongo Record folgendermaßen aus:

{_id: ..., attributes: [10,25,30]}

Dann sollte ich nach Attributen indizieren und danach kann ich Folgendes abfragen:

db.items.find(attributes: {$all: [10,25,30]})

Vorteile sind:

War es hilfreich?

Lösung

Das (effiziente) Suchen in einem Geschäftskatalog ist in der Tat eine nicht triviale Aufgabe.

Ja, Sie können eine zusätzliche Sammlung erstellen und alle Werte dort speichern.

{name: "language", value: "English", numValue: "13"}

Nein, Sie müssen diese Sammlung nicht jedes Mal erneut abfragen.Die Datengröße ist hier wahrscheinlich gering, sodass Sie sie im Bewerbungsprozess zwischenspeichern können.Vergessen Sie nicht den Hinweis: Setzen Sie immer zuerst das Attribut mit der niedrigsten Kardinalität.

Ein anderer Ansatz wäre die Verwendung der Bitmaskierung. Da MongoDB jedoch eine begrenzte Ganzzahllänge hat, können Sie keine unbegrenzte Anzahl von Attributen erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top