Tengo un índice de MongoDB:
Reservation.index( { source: 1, accountID: 1, // <-- This is the only required field confirmationCode_1: 1, confirmationCode_2: 1, confirmationCode_3: 1 }, {name: "Unique_reservation_index_1", unique: true} );Aquí hay algunas entradas de muestra que tengo en la base de datos y quiero asegurarme de que no se puedan hacer duplicados:
[ { source: "A", accountID: "AAA", confirmationCode_1: "ABC" }, { source: "B", accountID: "BBB", confirmationCode_1: "ABC" confirmationCode_2: "DEF" }, { source: "C", accountID: "CCC", confirmationCode_3: "GHI" } ] A veces tengo el código de confirmationCode_1 configurado y no el código de confirmationCode_2 , otras veces tengo configurado el código de confirmationCode_1 y el código de confirmationCode_2 . Otras veces tengo el código de confirmationCode_3 configurado.
Quiero que MongoDB me permita tener el siguiente documento (faltan los campos confirmationCode_2 y confirmationCode_3 ). ¿Me dejará con el índice anterior?
{ source: "A", accountID: "123", confirmationCode_1: "ABC" } ¿Me impedirá agregar dos documentos similares con confirmationCode_2 no definido o se considerará lo mismo? Por ejemplo, si permite el documento anterior, ¿se evitará?
{ source: "A", accountID: "AAA", confirmationCode_1: "ABC_2" } Si no proporciono el campo confirmationCode_2 , ¿establece el campo confirmationCode_2 en null ?
Si cambio el índice único para incluir sparse: true , ¿cómo actuará de manera diferente?
Reservation.index( { source: 1, accountID: 1, // <-- This is the only required field confirmationCode_1: 1, confirmationCode_2: 1 }, {name: "Unique_reservation_index_1", unique: true, sparse: true} );Del documento MongoDB en un índice único ,
Un índice único garantiza que los campos indexados no almacenen valores duplicados
Se permite un campo indefinido/vacío/nulo siempre que no tenga la misma tupla de valores de los campos en el índice compuesto.
A continuación se muestra el resultado real de mi prueba: 
Puede observar que el documento se agregó con éxito bajo el índice único.
¿Los índices únicos ignorarán los campos que no existen?
No, el índice almacenará un valor nulo para este campo, MongoDB impondrá la unicidad en la combinación de los valores clave del índice.
//You have this docuemt on you MongoDB { source: "A", accountID: "123", confirmationCode_1: "ABC" } //You try to insert the next document, note the missing "accountID" field //Even though "source" and "confirmationCode_1" //This operation SUCCESS because //MongoDB will enforce uniqueness on the "combination" of the index key values { source: "A", confirmationCode_1: "ABC" } //You try to insert the next document //The operation FAIL to insert the document //because of the violation of the unique constraint //on the combination of key values { source: "A", accountID: "123", confirmationCode_1: "ABC" } ¿Qué sucede si cambia unique: true a unique: true, sparse: true ?
Un índice que es disperso y único evita que la colección tenga documentos con valores duplicados para un campo, pero permite múltiples documentos que omiten la clave.