Cómo indexar atributos dinámicos en MongoDB

8

Tengo el siguiente tipo de datos (simplificado un poco de mi caso real) en MongoDB:

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

La matriz attrs es un contenedor de atributos dinámicos, es decir, no sé de antemano qué tipo de atributos se colocan allí. n significa nombre y v representa valor.

El libro MongoDB In Action describe esto como una solución para tener atributos dinámicos en el caso de que los atributos sean completamente actualizables. También describe que puede indexarlo así:

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

Las consultas se pueden hacer así:

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

Cuando pruebo esto, obtengo un rendimiento muy pobre. Probé con mycollection con 2 millones de documentos y sin índice parece funcionar mejor.

Entonces, la pregunta es, ¿hay alguna manera de indexar este tipo de configuración dinámica de atributos para que la indexación ofrezca un buen rendimiento? En mi caso, no es factible simplemente tener claves como "asunto" y "descripción" e indexarlas todas ...

Kaitsu
fuente

Respuestas:

5

También hice esta misma pregunta (en una forma un poco ampliada) en la lista de correo mongodb-user , donde obtuve una respuesta. Lea desde allí para obtener más detalles. La respuesta corta es que la estrategia utilizada en la pregunta debería funcionar bien, pero hay un problema que la hace muy ineficiente. Con suerte, el problema se solucionará pronto.

Para mi caso, solo necesito consultar coincidencias exactas para la tupla {n, v}, para poder crear un índice multiciclo:

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

y hacen que pregunten así:

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

que funciona muy bien y usa el índice de manera muy efectiva.

Kaitsu
fuente
0

La misma pregunta se hizo aquí . A partir de la versión 4.2 de MongoDB, anunciaron índices comodín. Aquí hay un ejemplo:

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