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"]}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top