Compartir a través de


Administración de la indexación en el núcleo virtual de Azure Cosmos DB for MongoDB

SE APLICA A: núcleo virtual de MongoDB

Los índices son estructuras que mejoran la velocidad de recuperación de datos al proporcionar acceso rápido a los campos de una colección. Funcionan creando un conjunto ordenado de punteros a datos, a menudo basados en campos clave. El núcleo virtual de Azure Cosmos DB for MongoDB usa índices en varios contextos, como la inserción de consultas, las restricciones únicas y el particionamiento.

Importante

El campo "_id" es el único campo indexado de forma predeterminada y el tamaño máximo del campo puede ser 2 KB. Se recomienda agregar índices adicionales basados en filtros de consulta y predicados para optimizar el rendimiento.

Tipos de índice

Para simplificar, consideremos el ejemplo de una aplicación de blog con la siguiente configuración:

  • Nombre de base de datos: cosmicworks
  • Nombre de la colección: products

En esta aplicación de ejemplo se almacenan artículos como documentos con la estructura siguiente. Todo el ejemplo entrecomillado utiliza aún más la estructura de esta colección.

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": {lastName: "Doe", firstName: "John"},
  "category": "Technology",
  "launchDate": ISODate("2024-06-24T10:08:20.000Z"),
  "published": true
}

Índices de campo único

Los índices de campo único almacenan información de un único campo de una colección. No importa el criterio de ordenación del índice de campo único. _id el campo permanece indexado de forma predeterminada.

El núcleo virtual de Azure Cosmos DB for MongoDB admite la creación de índices a continuación

  • Campos de documento de nivel superior.
  • Documento incrustado.
  • Campos dentro del documento incrustado.

El comando siguiente crea un índice de campo único en el campo author y el siguiente comando lo crea en un campo firstNameincrustado.

use cosmicworks

db.products.createIndex({"author": 1})

// indexing embedded property
db.products.createIndex({"author.firstName": -1})

Una consulta puede usar varios índices de campo único cuando estén disponibles.

Nota:

El núcleo virtual de Azure Cosmos DB for MongoDB permite crear un máximo de 64 índices en una colección. En función del nivel, podemos planear la extensión hasta 300 índices a petición.

Índices compuestos

Los índices compuestos mejoran el rendimiento de la base de datos al permitir consultas y ordenación eficaces en función de varios campos dentro de los documentos. Esta optimización reduce la necesidad de examinar colecciones completas, lo que acelera la recuperación de datos y la organización.

El comando siguiente crea un índice compuesto en los campos author y launchDate en criterio de ordenación inverso.

use cosmicworks

db.products.createIndex({"author":1, "launchDate":-1})

Order de los campos afectan a la selectividad o al uso del índice. La consultafind no usaría el índice creado.

use cosmicworks

db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})

Limitaciones

  • Máximo de 32 campos\rutas de acceso dentro de un índice compuesto.

Índices parciales

Índices que tienen un filtro de consulta asociado que describe cuándo generar un término en el índice.

use cosmicworks

db.products.createIndex (
   { "author": 1, "launchDate": 1 },
   { partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)

Limitaciones

  • Los índices parciales no admiten ORDER BY ni UNIQUE a menos que el filtro califique.

Índices de texto

Los índices de texto son estructuras de datos especiales que optimizan las consultas basadas en texto, lo que las hace más rápidas y eficaces.

Use el método createIndex con la opción text para crear un índice de texto en el campo title.

use cosmicworks;

db.products.createIndex({ title: "text" })

Nota:

Aunque solo puede definir un índice de texto por colección, el núcleo virtual de Azure Cosmos DB for MongoDB le permite crear índices de texto en combinación de varios campos para permitirle realizar búsquedas de texto en distintos campos de los documentos.

Configurar opciones de índice de texto

Los índices de texto del núcleo virtual Azure Cosmos DB for MongoDB incluyen varias opciones para personalizar su comportamiento. Por ejemplo, puede especificar el idioma para el análisis de texto, establecer ponderaciones para priorizar determinados campos y configurar búsquedas que no distinguen mayúsculas de minúsculas. Este es un ejemplo de creación de un índice de texto con opciones:

  • Crear un índice para admitir la búsqueda en el title y content los campos con soporte en inglés. Además, se ha asignado mayor peso al campo title para darle prioridad en los resultados de búsqueda.

    use cosmicworks
    
    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Nota:

Cuando un cliente realiza una consulta de búsqueda de texto con el término "Cosmos DB", la puntuación de cada documento de la colección se calculará en función de la presencia y frecuencia del término en los campos "título" y "contenido", con mayor importancia del campo "título" debido a su mayor peso.

Realizar una búsqueda de texto mediante un índice de texto

Una vez creado el índice de texto, puede realizar búsquedas de texto mediante el operador "text" en las consultas. El operador de texto toma una cadena de búsqueda y la compara con el índice de texto para buscar los documentos pertinentes.

  • Realice una búsqueda de texto para la frase Cosmos DB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "Cosmos DB" } }
    )
    
  • Opcionalmente, use el operador de proyección $meta junto con el campo textScore en una consulta para ver el peso

    use cosmicworks
    
    db.products.find(
    { $text: { $search: "Cosmos DB" } },
    { score: { $meta: "textScore" } }
    )
    

Limitaciones

  • Solo se puede definir un índice de texto en una colección.
  • Los índices de texto admiten búsquedas de texto simples y aún no proporcionan funcionalidades de búsqueda avanzadas como expresiones regulares.
  • Las operaciones de ordenación no pueden usar el orden del índice de texto en MongoDB.
  • Hint() no es compatible con una consulta que utilice la expresión $text.
  • Los índices de texto pueden ser relativamente grandes y consumir un espacio de almacenamiento significativo en comparación con otros tipos de índice.

Índices carácter comodín

Índice en un solo campo, indexa todas las rutas de acceso debajo de field , excepto otros campos que están en el mismo nivel. Por ejemplo, para el siguiente documento de ejemplo

{
 "children":
    {
     "familyName": "Merriam",
     "pets": { "details": {“name”: "Goofy", ”age”: 3} }
   } 
}

Crear un índice en { "pets.$**": 1 }, crea un índice sobre las propiedades de detalles y subdocumentos, pero no crea un índice en "familyName".

Limitaciones

  • Los índices se carácter comodín no admiten índices únicos.
  • Los índices comodín no admiten inserciones de ORDER BY a menos que el filtro incluya solo rutas de acceso presentes en el carácter comodín (ya que no indexan elementos sin definir)
  • Un índice de caracteres comodín compuesto solo puede tener one término comodín y one o más términos de índice adicionales. { "pets.$**": 1, “familyName”: 1 }

Índices geoespaciales

Los índices geoespaciales admiten consultas en los datos almacenados como objetos GeoJSON o pares de coordenadas heredados. Puede usar índices geoespaciales para mejorar el rendimiento de las consultas en datos geoespaciales o para ejecutar determinadas consultas geoespaciales.

El núcleo virtual de Azure Cosmos DB for MongoDB proporciona dos tipos de índices geoespaciales:

  • Índices 2dsphere, que admiten consultas que interpretan la geometría en una esfera.
  • Índices 2d, que admiten consultas que interpretan la geometría en una superficie plana.

Índices 2d

Los índices 2d solo se admiten con el estilo heredado del par de coordenadas de almacenamiento de datos geoespaciales.

Use el método createIndex con la opción 2d para crear un índice geoespacial en el campo location.

db.places.createIndex({ "location": "2d"});

Limitaciones

  • Solo one campo de ubicación puede formar parte del índice 2d y solo one campo no geoespacial puede formar parte del índice de compound 2d db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

Índices 2dsphere

Los índices 2dsphere admiten consultas geoespaciales en una esfera similar a la Tierra. Puede admitir objetos GeoJSON o pares de coordenadas heredados. Los índices 2dSphere funcionan con el estilo GeoJSON de almacenar datos, si se encuentran puntos heredados, estos pueden convertirse en punto GeoJSON.

Use el método createIndex con la opción 2dsphere para crear un índice geoespacial en el campo location.

db.places.createIndex({ "location": "2dsphere"});

Los índices 2dsphere permiten crear índices en varios campos de datos geoespaciales y varios no geoespaciales. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Limitaciones

  • No se admite un índice compuesto mediante un índice normal y un índice geoespacial. La creación de cualquiera de los índices geoespaciales provocaría errores.

    // Compound Regular & 2dsphere indexes are not supported yet
    db.collection.createIndex({a: 1, b: "2dsphere"})
    
    // Compound 2d indexes are not supported yet
    db.collection.createIndex({a: "2d", b: 1})
    
  • Los polígonos con agujeros no funcionan. La inserción de un polígono con agujero no está restringida, aunque se produce un error en la consulta $geoWithin para escenarios:

    1. Si la propia consulta tiene polígono con agujeros

      coll.find(
        {
            "b": {
                "$geoWithin": {
                    "$geometry": {
                        "coordinates": [
                            [
                                [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0]
                            ],
                            [
                                [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5]
                            ]
                        ],
                        "type": "Polygon"
                    }
                }
            }
        })
      
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    2. Si hay algún documento sin filtrar que tenga polígono con agujeros.

      [mongos] test> coll.find()
        [
          {
            _id: ObjectId("667bf7560b4f1a5a5d71effa"),
            b: {
              type: 'Polygon',
              coordinates: [
                [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ],
                [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ]
              ]
            }
          }
        ]
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    3. El campo key es obligatorio mientras se usa geoNear.

       [mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }])
      
       // MongoServerError: $geoNear requires a 'key' option as a String
      

Pasos siguientes