stages query mongo convert mongodb indexing mongodb-indexes

mongodb - query - Índices dispersos y valores nulos en mongo



mongodb date operators (3)

Los índices dispersos no contienen documentos que faltan campo indexado. Sin embargo, si el campo existe y tiene un valor null , todavía se indexará. Por lo tanto, si la ausencia del campo y su igualdad a null tienen el mismo aspecto para su aplicación y desea mantener la singularidad de fbId , simplemente no la inserte hasta que tenga un valor para ella.

Necesita índices dispersos cuando tiene una gran cantidad de documentos, pero solo una pequeña parte de ellos contiene algún campo, y desea poder encontrar rápidamente documentos por ese campo. Crear un índice normal sería demasiado costoso, simplemente desperdiciaría la valiosa RAM en la indexación de documentos en los que no está interesado.

No estoy seguro de entender correctamente los índices dispersos.

Tengo un índice único disperso en fbId

{ "ns" : "mydb.users", "key" : { "fbId" : 1 }, "name" : "fbId_1", "unique" : true, "sparse" : true, "background" : false, "v" : 0 }

Y esperaba que eso me permitiera insertar registros con null como fbId, pero que arroja una excepción de clave duplicada. Solo me permite insertar si la propiedad fbId se elimina por completo.

¿No se supone que un índice escaso trata con eso?


Para garantizar el máximo rendimiento de los índices, es posible que desee omitir la indexación de aquellos documentos que NO contienen el campo en el que está realizando un índice. Para hacer esto, MongoDB tiene la propiedad dispersa que funciona de la siguiente manera:

db.addresses.ensureIndex( { "secondAddress": 1 }, { sparse: true } );

Este índice omitirá todos los documentos que no contengan el segundo campo de Dirección y al realizar una consulta, esos documentos nunca se escanearán.

Permítanme compartir este artículo sobre índices básicos y algunas de sus propiedades:

Índices geoespaciales, de texto, de hash y propiedades únicas y dispersas: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/


{a:1, b:5, c:2} {a:8, b:15, c:7} {a:4, b:7} {a:3, b:10}

Supongamos que deseamos crear un índice en los documentos anteriores. Crear un índice en a & b no será un problema. Pero qué pasa si necesitamos crear un índice en c . La restricción única no funcionará para las claves c porque el valor nulo se duplica para 2 documentos. La solución en este caso es usar la opción sparse . Esta opción le dice a la base de datos que no incluya los documentos que faltan la clave. El comando en cuestión es db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}) . El índice disperso nos permite usar menos espacio también.

Tenga en cuenta que incluso si tenemos un índice sparse , la base de datos realiza todos los documentos escaneados, especialmente cuando se realiza la clasificación. Esto se puede ver en la sección del plan ganador del resultado de la explain .