2011-12-22 40 views
17

No estoy seguro de entender correctamente los índices dispersos.índices dispersos y valores nulos en mongo

que tienen un índice único escasa en fbId

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

y esperaba que me permitiría insertar registros con nulo como fbId, pero que produce una excepción de copia de la llave. Solo me permite insertar si la propiedad fbId se elimina por completo.

¿No se supone que un índice disperso lidia con eso?

Respuesta

31

Los índices dispersos no contienen documentos que omiten el campo indexado. Sin embargo, si el campo existe y tiene el valor de null, aún estará indexado. 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 lo inserte hasta que tenga un valor para él.

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 documentos rápidamente en ese campo. Crear un índice normal sería demasiado caro, desperdiciaría una RAM preciosa en documentos de indexación que no le interesan.

1

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

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

Este índice se omiten todos los documentos que no contienen el campo secondAddress y al realizar una consulta, no se van a analizar los documentos.

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

Geoespaciales, texto, índices hash y propiedades únicas y escasas: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

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

Supongamos que deseamos crear una índice en los documentos anteriores. Crear índice en a & b no será un problema. Pero, ¿y si necesitamos crear un índice en c? La restricción única no funcionará para las claves c porque valor nulo está duplicado 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 omiten la clave. El comando en cuestión es db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}). El índice escaso nos permite usar menos espacio también.

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

Cuestiones relacionadas