2013-08-27 4 views
0

J'ai un doute sur MongoDB sparse Index. J'ai une collection (post) avec très peu de documents (6K le plus grand) qui pourrait intégrer un sous-document ainsi:MongoDB sparse Index et Array: trop de documents indexés

{ 
    "a": "a-val", 
    "b": "b-val", 
    "meta": { 
    "urls": [ "url1", "url2" ... ], 
    "field1": "value1", 
    ... 
    } 
} 

Le champ "a" et "b" sont présente toujours, mais " meta.urls "pourrait être inexistant!

Maintenant, je l'ai inséré un seul document avec la valeur « meta.urls », puis je l'ai fait

db.post.ensureIndex({"a": 1, "b": 1, "meta.urls": 1}, {sparse: true}); 

stats post me donne un résultat « étrange »: l'indice est d'environ 97MB! Comment est-ce possible? Un seul document avec "meta.urls" inséré, et la taille de l'index est de 97 Mo?

Alors, j'ai essayé de ne créer qu'un indice "meta.urls" de cette façon:

db.post.ensureIndex({"meta.urls": 1}, {sparse: true}); 

J'ai maintenant indice "meta.urls_1" avec seulement 1 document. Mais si j'explique une requête simple comme celui-ci

db.post.find({"meta.urls": {$exists: true}}).hint("meta.urls_1").explain({verbose: true}); 

J'ai un autre résultat « étrange »:

"n" : 1, 
"nscannedObjects" : 5, 
"nscanned" : 5, 

Pourquoi Mongo scanne 5 docs, un pas seulement celui de l'indice?

Si je demande une correspondance précise sur "meta.urls", l'index sparse simple fonctionnera correctement.

Exemple: db.post.find ({ "meta.urls": "url1"}). Indice ("meta.old_slugs_1") // 1 Document

Répondre

0

Pour votre première question: vous pouvez utiliser un index composé pour rechercher sur un préfixe des clés qu'il indexe. Par exemple, votre premier index sera utilisé si vous avez effectué une recherche sur a ou les deux a et b. Ainsi, le sparse ne pourra pas indexer les documents où a est nul.

Je n'ai pas de réponse à votre deuxième question, mais vous devriez essayer de mettre à jour MongoDB et d'essayer à nouveau - son déplacement assez rapidement, et les index épars se sont améliorés au cours des derniers mois.

Questions connexes