Índices de MongoDB en subdocumentos que no se utilizan según la sintaxis de la consulta

Hashcut

Estoy usando Meteor con MongoDB con una colección de documentos como este:

{a: 'a1',
 b: 'b1',
 c: {
     d: 'd1',
     e: 'e1'
    }
}

Inicialmente creé un índice como este: collection._ensureIndex({'c.d': 1});

Y corrió consulta como esta: collection.find({c: {d: 'd1'}). Estos se ejecutaron extremadamente lentamente y cuando depuré con explicar (), me di cuenta de que no estaban usando el índice.

Otoh, si me encontré con una consulta como esta: collection.find({'c.d': 'd1'})y, a continuación Mongo sería utilizar el índice.

Ahora he cambiado el índice para indexar todo el subdocumento collection._ensureIndex({c: 1}), es decir , y la primera consulta ahora llega al índice.

Mi pregunta es, ¿es esto un error o una característica? Mi impresión fue que en JSON, las dos notaciones son equivalentes y, francamente, esperaría que una base de datos sea lo suficientemente inteligente como para darse cuenta de que los dos términos de consulta se refieren al mismo campo y usan el índice apropiado.

Mi preocupación con la solución alternativa de indexar todo el subdocumento es que, eventualmente, ese subdocumento puede contener más campos que no necesito indexar, y parece subóptimo perder tiempo y RAM con términos de índice que no necesito.

Si esto no es un error, ¿hay alguna manera de hacer que Mongo reconozca la sintaxis del objeto anidado y use el índice correctamente?

Hashcut

Creo que lo descubrí después de revisar los documentos de Mongo. Básicamente, no es una diferencia en la semántica entre los dos. Básicamente, en la primera forma de la consulta {c: {d: d1}}, mongo asume que está especificando todo el subdocumento. Entonces, si tiene un subdocumento {c: {d: d1, e: e1}}, no coincidirá.

OTOH, la segunda forma de la consulta {'c.d': d1}implica que solo está especificando una coincidencia en un campo dentro del subdocumento. Esto coincidiría incluso si el subdocumento tiene otros campos o subdocumentos completos.

Esta diferencia se extiende al índice. _ensureIndex({c: 1})y _ensureIndex({'c.d': 1})son dos índices diferentes, y aunque el primero indexa todo el subdocumento, no se utilizará si consulta en un campo individual con la c.dnotación.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Valor de la consulta en el diccionario de subdocumentos MongoDB

Convierta la consulta de MongoDB en la sintaxis Spring MongoDB

Consulta en MongoDB que la búsqueda es verdadera; problemas de sintaxis de consulta

Actualizar la matriz de subdocumentos en MongoDB

Cómo activar la consulta de búsqueda en subdocumentos en MongoDB

¿Cómo se utilizan diferentes nombres de clase en el componente según la ruta?

¿Se utilizan los índices de tabla en la selección en el conjunto de resultados de una subconsulta en la cláusula FROM?

Los resultados de la consulta principal se utilizan de nuevo en la subconsulta

¿Por qué los parámetros se utilizan con menos frecuencia que las cadenas de consulta en la URL HTTP?

¿Cómo puedo obtener elementos de un modelo que no se utilizan en la relación ManyToMany?

La propiedad de navegación no se materializó en la sintaxis de consulta de Linq y la carga diferida no funcionó

Ayuda de sintaxis en la consulta SQL de sesión

¿Existe una solución que convierta la siguiente sintaxis de consulta LINQ en sintaxis de método con Lambdas?

Desplazar la posición de la columna a la derecha según los criterios que utilizan Pandas

Error de tiempo de ejecución 1004 no se puede obtener la propiedad de coincidencia cuando se utilizan dos índices / coincidencias

Eliminar la información de la marca de tiempo según los criterios que utilizan pandas

¿Cómo modificar la sintaxis de Row_Number en SQL para que los números de fila se asignen según una condición?

Agrupar la matriz de subdocumentos por clave en MongoDB

¿Cómo ordenar la matriz de subdocumentos en mongoose / mongodb?

La mejor forma de agregar subdocumentos anidados en mongoDB

¿Los resultados de la consulta que utilizan la multiplicación no son los mismos?

filtro mongodb de la matriz de subdocumentos

Propuesta para la sintaxis de Python: ¿que se incluiría en la implementación?

Cuando se utilizan variables CSS (propiedades personalizadas de CSS), ¿por qué la sintaxis de configuración y la sintaxis de obtención son diferentes?

error de sintaxis en la consulta de actualización de mysql mi sintaxis es correcta

error de sintaxis en la consulta de actualización de mysql mi sintaxis es correcta

MSACCESS 2010 VBA; Error de sintaxis en la fecha en la expresión de la consulta

MongoDB empujando a múltiples subdocumentos en la misma consulta

MongoDB empujando a múltiples subdocumentos en la misma consulta

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    uitableview delete button image in iOS

  3. 3

    Pandas의 CSV 파일을 Pandas 데이터 프레임으로 가져 오기

  4. 4

    El nombre 'HttpContext' no existe en el contexto actual en Razor

  5. 5

    Verilog : 입력 신호를 한 클럭 주기로 지연시키는 방법은 무엇입니까?

  6. 6

    WPF pleine largeur DataGridColumn sur la largeur de DataGrid

  7. 7

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  8. 8

    Python, Pandas para hacer coincidir el marco de datos e indicar los hallazgos de una lista

  9. 9

    No se puede trazar la barra doble, trazar la barra usando pyplot para ndarray

  10. 10

    2D 배열에 대한 Numpy 요소 별 평균 계산

  11. 11

    ¿Cómo formatear el valor mínimo y máximo de android-range-seek-bar?

  12. 12

    Problème avec le dessin d'un élément Qml avec des appels OpenGL bruts

  13. 13

    Enlace débil de iOS Framework: error de símbolos indefinidos

  14. 14

    desbordamiento: oculto no funciona al hacer zoom en un iframe de YouTube usando transformar

  15. 15

    Swift / Firebase : Facebook 사용자가 계정을 만들 때 Firebase 데이터베이스에 제대로 저장하려면 어떻게해야합니까?

  16. 16

    multiplica dos números negativos en c ++

  17. 17

    Pandas: suma filas de DataFrame para columnas dadas

  18. 18

    matplotlib로 그래프를 그리는 동안 커서 위치에서 날짜 / 시간을 볼 수 없습니다. "DateFormatter에서 x = 0 값을 찾았습니다"라는 오류가 발생합니다.

  19. 19

    UIButton textLabel with different fonts

  20. 20

    Error de la base de datos de Android Firebase: Permiso denegado al depurar en un teléfono

  21. 21

    Room compile problem - column references a foreign key but it is not part of an index

CalienteEtiquetas

Archivo