Comment indexer des attributs dynamiques dans MongoDB

8

J'ai le type de données suivant (simplifié un peu de mon cas réel) dans MongoDB:

{
    "name":"some name",
    "attrs":[
        {"n":"subject","v":"Some subject"},
        {"n":"description","v":"Some great description"},
        {"n":"comments","v":"Comments are here!"},
        ]
}

Le tableau attrs est un conteneur pour les attributs dynamiques, c'est-à-dire que je ne sais pas à l'avance quel type d'attributs y sont mis. n signifie nom et v signifie valeur.

Le livre MongoDB In Action décrit cela comme une solution pour avoir des attributs dynamiques dans le cas où les attributs sont complètement imprévisibles. Il décrit également que vous pouvez l'indexer comme ceci:

db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})

Les requêtes peuvent alors être faites comme ceci:

db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})

Quand je teste cela, j'obtiens de très mauvaises performances. J'ai testé avec mycollection ayant 2 millions de documents et n'ayant aucun index semble fonctionner mieux.

Donc, la question se pose: existe-t-il un moyen d'indexer ce type de paramètre d'attribut dynamique afin que l'indexation donne de bonnes performances? Dans mon cas, il n'est pas possible d'avoir juste des clés comme "sujet" et "description" et de les indexer toutes ...

Kaitsu
la source

Réponses:

5

J'ai également posé cette même question (sous une forme un peu élargie) sur la liste de diffusion mongodb-user , où j'ai obtenu une réponse. Lisez à partir de là pour obtenir plus de détails. La réponse courte est que la stratégie utilisée dans la question devrait fonctionner correctement, mais il y a un problème qui la rend très inefficace. Espérons que le problème sera résolu bientôt.

Pour mon cas, je n'ai besoin que de rechercher des correspondances exactes pour le tuple {n, v}, afin de pouvoir créer un index multivoies:

db.mycollection.ensureIndex({"attrs":1})

et les faire interroger comme ceci:

db.mycollection.find({"attrs": {n: "subject", v: "Some subject"}})

qui fonctionne très bien et utilise l'index très efficacement.

Kaitsu
la source
0

La même question a été posée ici . À partir de la version 4.2 de MongoDB, ils ont annoncé des index génériques. Voici un exemple:

db.myCollection.createIndex( { "subdocument.$**": 1 } );
Alisettar Huseynli
la source