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