Un índice único asegura que los campos indexados no almacenen valores duplicados y que un valor aparezca como máximo una vez para un campo dado. Un índice compuesto único asegura que cualquier combinación dada de los valores clave del índice aparezca como máximo una vez. Por defecto, MongoDB crea un índice único sobre el _id campo durante la creación de una colección.
Puede crear y administrar índices únicos en la Interfaz de Usuario para implementaciones alojadas en MongoDB Atlas.
Crear un índice único
Para crear un índice único, utiliza el db.collection.createIndex() método con la opción unique configurada a true.
db.collection.createIndex( <key and index type specification>, { unique: true } )
Índice único en un solo campo
Por ejemplo, para crear un índice único en el campo email de la colección users, utiliza la siguiente operación en mongosh:
db.users.createIndex( { "email": 1 }, { unique: true } )
Índice compuesto único
También puedes aplicar una restricción de unicidad en la combinación de valores de clave de índice para un índice compuesto.
Por ejemplo, para crear un índice único en los campos name, email y password de la colección users, utiliza la siguiente operación en mongosh:
db.users.createIndex( { name: 1, email: 1, password: 1 }, { unique: true } )
Crea un índice compuesto único multikey en email y name:
db.users.createIndex( { "email": 1, "name": 1 }, { unique: true } )
El índice único permite la inserción de los siguientes documentos en la colección, ya que el índice aplica la unicidad de la combinación de valores de email y name:
db.users.insertMany( [ { name: "Catelyn Stark", email: [ "catelyn@gameofthron.es", "sean_bean@gameofthron.es" ], password: "$2b$12$hash2" }, { name: "Arya Stark", email: [ "catelyn@gameofthron.es" ], password: "$2b$12$hash3" } ] )
A pesar de que ambos documentos contienen "catelyn@gameofthron.es" en sus arreglos email, la operación se realiza correctamente porque la combinación de cada valor de correo electrónico con el campo name es única.
Comportamiento
Restricciones
MongoDB no puede crear un índice único en el campo o campos de índice especificados si la colección ya contiene datos que violarían la restricción única para el índice.
No puedes especificar una restricción única en un índice encriptado.
Creación de un índice único en sets de réplicas y clústeres particionados
Para los sets de réplicas y clústeres particionados, el uso de un procedimiento escalonado para crear un índice único requiere que detenga todas las operaciones de escritura en la colección durante el procedimiento. Si no pueden detener todas las operaciones de escritura en la colección durante el procedimiento, no se debe usar el procedimiento de actualización gradual. En su lugar, para crear el índice único en la colección se debe:
Ejecutar
db.collection.createIndex()en el primario para un set de réplicasEjecuta
db.collection.createIndex()en elmongospara un clúster particionado
Restricción única entre documentos separados
El índice único impide que diferentes document en la colección tengan el mismo valor para la clave indexada.
Debido a que la restricción se aplica a documentos separados, para un índice multiclave único, un documento puede tener elementos de arreglos que resulten en valores de clave de índice repetidos, siempre que los valores de clave de índice para ese documento no dupliquen los de otro documento. En este caso, la entrada de índice repetida se inserta en el índice una sola vez.
Por ejemplo, cree un índice multiclave compuesto único en email y name:
db.users.createIndex( { "email": 1, "name": 1 }, { unique: true } )
El índice único permite la inserción del siguiente documento en la colección si ningún otro documento en la colección tiene un valor de clave de índice de { "email": "arya@winterfell.com", "name": null }.
db.users.insertOne( { _id: ObjectId("59b99db4cfa9a34dcd7885b9"), email: [ "arya@winterfell.com", "arya@gameofthron.es" ] } )
Campo de documento ausente en un índice único de campo único
Si un documento tiene un valor null o falta un valor para el campo indexado en un índice de campo único, el índice almacena un valor null para ese documento. Debido a la restricción de unicidad, un índice único de un solo campo solo puede contener un documento que tenga un valor null en la entrada de índice. Si hay más de un documento con un valor de null en la entrada de índice, la creación de índices falla y muestra un error de clave duplicada.
Por ejemplo, una colección tiene un índice único de un solo campo en email:
db.users.createIndex( { "email": 1 }, { unique: true } )
El índice único permite la inserción de un document sin el campo email si la colección no contiene ya un document que carezca del campo email:
db.users.insertOne( { name: "Arya Stark" } )
Sin embargo, no puedes insertar un segundo document sin el campo email si la colección ya contiene un document al que le falta el campo email. Una segunda operación que intenta insertar otro document sin el campo email falla al insertar el document debido a la violación de la restricción única en el campo email.
Índices parciales únicos
Si utiliza tanto el partialFilterExpression como una restricción única, la restricción única solo se aplica a los document que cumplen con la expresión de filtro. Para ver un ejemplo, consulta Índice parcial con restricción de unicidad.
Clústeres particionados e índices únicos
No puedes especificar una restricción única en un índice encriptado.
Para una colección particionada clasificada por rango, solo los siguientes índices pueden ser únicos:
El índice en la clave de partición
Un índice compuesto donde la clave de partición es un prefijo
El índice
_idpor defecto; sin embargo, el índice_idsolo aplica la restricción de unicidad por fragmento si el campo_idno es la clave de fragmentación.
Además, si existe una intercalación en la clave del índice, sólo se puede garantizar la unicidad si la intercalación es simple.
Importante
Los clústeres particionados no aplican la restricción de unicidad en los campos _id en todo el clúster cuando el campo _id no es la clave de partición.
Si el campo _id no es la clave de partición, la restricción de unicidad solo se aplica a la partición que almacena el documento. Esto significa que dos o más documentos pueden tener el mismo valor _id, siempre que se encuentren en particiones diferentes.
Por ejemplo, una colección particionada con la clave de partición {x:
1} que se extiende por dos particiones A y B. Dado que la clave _id no es la clave de partición, la colección podría tener un documento con el valor _id 1 en la partición A y otro documento con el valor _id 1 en el partición B.
En los casos en que el campo _id no sea la clave de partición, MongoDB espera que las aplicaciones garanticen la unicidad de los valores de _id entre las particiones, por ejemplo, utilizando un identificador único para completar el campo _id.
Las restricciones de índices únicos implican que:
Para una colección particionada, no puede fragmentarse la colección si tiene varios índices únicos, a menos que la clave de partición sea el prefijo de todos los índices únicos.
Para una colección ya particionada, no puedes crear índices únicos en otros campos a menos que la clave de partición se incluya como prefijo.
Un índice único almacena un valor nulo para un documento que carece del campo indexado; es decir, un campo de índice ausente se trata como otra instancia de un valor de clave de índice
null. Para obtener más información, consulta Campo de documento faltante en un índice único de un solo campo.
Para mantener la singularidad en un campo que no es la clave de partición, se debe consultar Restricciones de singularidad en campos arbitrarios.
Índices únicos escasos y no escasos
A partir de MongoDB 5.0, pueden existir índices únicos dispersos e índices únicos no dispersos con el mismo patrón de clave en una sola colección.
Creación de índices únicos y dispersos
Este ejemplo crea múltiples índices con el mismo patrón de clave y diferentes opciones de sparse:
db.users.createIndex( { password : 1 }, { name: "unique_index", unique: true } )
db.users.createIndex( { password : 1 }, { name: "unique_sparse_index", unique: true, sparse: true } )
Creación de índices básicos y dispersos
También se pueden crear índices básicos con el mismo patrón de claves con y sin la opción de dispersión:
db.users.createIndex( { password : 1 }, { name: "sparse_index", sparse: true } )
db.users.createIndex( { password : 1 }, { name: "basic_index" } )
Índices básicos y únicos con patrones de claves duplicadas
Los índices básicos y únicos pueden existir con el mismo patrón de clave.
Por ejemplo, se pueden crear los dos índices siguientes que utilicen el mismo patrón de clave:
db.users.createIndex( { email : 1 }, { name: "basic_index" } )
db.users.createIndex( { email : 1 }, { name: "unique_index", unique: true } )