2012-02-02 4 views
3

Je construis une application web avec mongoDB comme backend. Certains documents doivent stocker une collection d'éléments dans une sorte de liste, puis le système devra vérifier fréquemment si un élément spécifié est présent dans cette liste. L'utilisation de l'opérateur 'in' de Python prend le temps de Big-O (N), n étant la taille de la liste. Comme ces listes peuvent devenir assez volumineuses, je veux quelque chose de plus rapide que cela. Le type 'set' de Python fait cette opération dans le temps constant (et impose l'unicité, ce qui est bien dans mon cas), mais est considéré comme un type de données invalide à mettre dans MongoDB.Mongodb avec le type "set()" de Python

Alors, quelle est la meilleure façon de le faire? Est-il possible d'utiliser simplement une liste régulière et d'exploiter les fonctions d'indexation de mongo? Encore une fois, je veux savoir, pour un document donné dans une collection, une liste à l'intérieur de ce document contient-elle un élément particulier?

+2

Notez que Big-O (n) time * est * temps linéaire, et 'set' fonctionne en Big-O (1) fois dans le cas moyen qui est * temps * constant. Cependant, 'set' est toujours l'heure de Big-O (n) dans le pire des cas (cela peut aussi être Big-O (log n) pire cas, mais je pense que Python est O (n) ...) – cha0site

+0

Le pire des cas est seulement lorsque vous avez 100% de collisions. Il est implémenté comme Hastable, c'est O (1) autant que les dictionnaires. –

+1

@ cha0site désolé je voulais écrire * temps * constant, pas * linéaire *. Je l'ai corrigé –

Répondre

3

Vous pouvez représenter un ensemble à l'aide d'un dictionnaire. Vos éléments deviennent les clés et toutes les valeurs peuvent être définies sur une constante telle que 1. L'opérateur in vérifie l'existence d'une clé.

EDIT. MongoDB stocke une dict en tant que document BSON, où les clés doivent être des chaînes (avec quelques restrictions supplémentaires), donc le conseil ci-dessus est d'utilisation limitée.

+0

Oh c'est génial! Pourquoi est-ce autorisé, mais un type 'set' n'est pas autorisé? Je pensais que cela avait quelque chose à voir avec la capacité ou l'incapacité d'un type de données à hacher, mais alors il ne serait pas logique que les dictionnaires soient autorisés. Je pense réellement avoir trouvé comment obtenir mongo pour indexer les éléments de la liste interne des éléments, ainsi je peux faire des requêtes logarithmiques de temps de "trouver l'élément de quelque id qui a un élément dans sa liste" et je peux vérifier si la requête retourne avec un curseur ou null. Mais merci pour l'indice, je pourrais l'utiliser plus tard. –