Filtrage mongodb par de nombreux paramètres (index composé ou non)
-
29-10-2019 - |
Question
J'ai un catalogue avec des produits et je veux le filtrer par de nombreux paramètres: catégorie, prix, taille, couleur, wieght, etc.
La question concerne donc l'indexation.
Je peux essayer d'utiliser l'index composé sur tous les champs et les interroger dans le même ordre que je les ai indexés. Mais que se passe-t-il si je dois filtrer uniquement par taille et couleur, puis uniquement par prix et poids? La création d'index de composés pour chaque requête de filtrage possible serait exagérée car il pourrait y avoir trop de paramètres.
Donc, après une recherche, j'ai trouvé un approche intéressante
Il est suggéré d'utiliser des "attributs normalisés":
{color: "red"} = 10
{weight: 125} = 25
{size: "M"} = 30
Et maintenant Mongo Record ressemblera à ceci:
{_id: ..., attributes: [10,25,30]}
Ensuite, je devrais indexer par attributs et après cela, je peux interroger de cette façon:
db.items.find(attributes: {$all: [10,25,30]})
Les avocats sont:
- index plus petits
- recherche plus rapide
- n'importe quel nombre de paramètres
- grandissant
Ce que je n'ai pas mal àstand, c'est comment obtenir ces chiffres pour chaque attribut? Sont-ils calculés d'une manière ou d'une autre (comme MD5)? Ou dois-je créer une collection différente et stocker chaque nombre de valeurs clés là-bas? Et obtenez les chiffres à partir de là d'abord - chaque fois que j'ai besoin de filtrer la collection "articles"?
Et que pensez-vous de cette approche?
METTRE À JOUR:Et si j'utilise des chaînes concaténées au lieu des nombres?
{_id: ..., attributes: ["language.English", "color.red"]}
La solution
La recherche (efficacement) dans un catalogue de magasins est en effet une tâche non triviale.
Oui, vous pouvez créer une collection supplémentaire et y stocker toutes les valeurs
{name: "language", value: "English", numValue: "13"}
Non, vous n'avez pas besoin de requérir cette collection à chaque fois. La taille des données ici sera probablement petite, vous pouvez donc les mettre en cache dans le processus d'application. N'oubliez pas l'indice: mettez toujours l'attribut avec la cardinalité la plus basse d'abord.
Une autre approche serait d'utiliser des mât bit, mais comme MongoDB a une longueur entière limitée, vous ne pouvez pas obtenir un nombre illimité d'attributs.