¿Por qué MongoDB verifica el orden de las claves al hacer coincidir documentos incrustados?

7

La documentación db.collection.find() incluye esta explicación de Consultar coincidencias exactas en documentos incrustados :

  

La siguiente operación devuelve documentos en la colección de bios donde el documento incrustado nombre es exactamente {primero: "Yukihiro", último: "Matsumoto"} , incluido el orden

Esto me parece muy extraño, ya que los documentos parecen tipos de datos no ordenados (me recuerdan a JSON, a los diccionarios de Python, etc.).

Cuando este problema levantó su cabeza fea en mi código, me tomó un tiempo averiguar qué estaba mal, ya que es tan poco intuitivo que el orden de las claves de un objeto JavaScript entraría en juego.

¿Por qué es este el comportamiento en MongoDB?

    
pregunta tscizzle 25.05.2016 - 18:48

1 respuesta

6
  

¿Por qué es este el comportamiento en MongoDB?

Los documentos de MongoDB se almacenan en el servidor en un formato binario llamado BSON (abreviatura de "Binary JSON"), que es como un JSON Formato que soporta tipos de datos adicionales. El formato JSON se diseñó para ser legible por humanos y derivó tipos de datos compatibles y comportamiento de JavaScript. BSON fue diseñado como un formato de intercambio de datos binarios con un control más preciso sobre la representación de datos.

Si bien BSON es similar a JSON, existen diferencias notables:

  • Una estructura de datos BSON es un objeto ordenado, no un diccionario. Por ejemplo, BSON no requiere que los nombres de los campos sean únicos (aunque los controladores suelen tener una interfaz similar a hash / diccionario / JSON que no admite nombres de campo duplicados). Esto proporciona a los desarrolladores una precisión que puede ser importante para algunos casos de uso y también evita la sobrecarga de servidores potencialmente innecesarios de la inspección y la serialización / deserialización recursiva de BSON en un orden de campo predefinido.
  • Cuando el orden es importante, los controladores admitidos oficialmente se basan en el lenguaje de programación subyacente para admitir una estructura de datos que conserva el orden o proporcionan la suya propia. Por ejemplo, el controlador Python (también conocido como PyMongo) incluye una clase SON para manipular objetos ordenados similar a un diccionario normal de Python.
  • BSON admite tipos de datos adicionales como datos binarios, enteros de 32 bits y 64 bits, flotantes y decimales (MongoDB 3.4+). Como un simple contraste para la representación numérica, JSON (y JavaScript) actualmente solo admite un tipo numérico único ( Number ) que representa todos los valores como un número de punto flotante de doble precisión.
  • MongoDB ha definido reglas de orden y clasificación para los valores BSON. Por ejemplo, MongoDB utiliza comparación binaria para las cadenas de forma predeterminada, por defecto y MongoDB 3.4+ agrega la opción de intercalación por idioma .
  

es tan poco intuitivo que el orden de las claves de un objeto Javascript entraría en juego

El ejemplo de consulta que proporcionó es para un coincidencia exacta en un documento incrustado , que incluye el orden de campo porque los datos subyacentes se ordenan en BSON. Esta consulta realiza una comparación binaria de la serialización BSON del documento incrustado provisto en su consulta con el valor del campo BSON con el documento incrustado almacenado en MongoDB. Es posible que pueda aprovechar el orden de los campos para colocar un campo más selectivo de manera consistente antes en su documento incrustado, lo que puede ayudar con el rendimiento de la consulta si ha indexado todo el documento incrustado.

Si el orden de los campos no es importante, debe consultar que coincida con los campos incrustados en su lugar, por ejemplo:

db.bios.find(
    {
       "name.first": "Yukihiro",
       "name.last": "Matsumoto"
    }
)

En este caso, creará un índice compuesto para apoya tus consultas comunes. La selectividad, el orden y la dirección de clasificación de las claves en la definición del índice serían importantes si desea que los índices eficientes admitan sus consultas.

    
respondido por el Stennie 16.01.2017 - 13:05

Lea otras preguntas en las etiquetas