Un índice único garantiza que los campos indexados no almacenen valores duplicados y que un valor aparezca como máximo una vez para un campo determinado. Un índice compuesto único garantiza que cualquier combinación de valores de clave de índice solo aparezca como máximo una vez. De forma predeterminada, MongoDB crea un índice único en el Campo_id durante la creación de una colección.
Puede Cree y administre índices únicos en la interfaz de usuario para implementaciones alojadas en MongoDB Atlas.
Crear un índice único
Para crear un índice único, utilice el db.collection.createIndex()Método con la unique opción establecida true en.
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 email campo de la users colección, utilice la siguiente operación mongosh en:
db.users.createIndex( { "email": 1 }, { unique: true } )
Índice compuesto único
También puede aplicar una restricción única a los índices compuestos. Un índice compuesto único garantiza la unicidad de la combinación de los valores de la clave del índice.
Por ejemplo, para crear un índice único en name losemail campos, y password de la users colección, utilice la siguiente operación mongosh en:
db.users.createIndex( { name: 1, email: 1, password: 1 }, { unique: true } )
El índice creado refuerza la unicidad de la combinación de name email password valores, y.
Cree un índice multiclave compuesto único email en name y:
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 exige unicidad para la combinación de email name valores y:
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" } ] )
Aunque ambos documentos tienen "catelyn@gameofthron.es" en sus email matrices, la operación tiene éxito porque la combinación de cada valor de correo electrónico con el name campo es única.
Comportamiento
Restricciones
MongoDB no puede crear un índice único en los campos de índice especificados si la colección ya contiene datos que violarían la restricción única del índice.
No se puede especificar una restricción única en un índice hash.
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 en documentos separados
La restricción única se aplica a documentos separados en la colección. Es decir, el índice único impide que documentos separados 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 documento sin el campo email si la colección no contiene ya un documento que carezca del campo email:
db.users.insertOne( { name: "Arya Stark" } )
Sin embargo, no se puede insertar un segundo documento sin el campo email si la colección ya contiene un documento que no tiene el campo password. Una segunda operación que intente insertar otro documento sin el campo email no lo logrará debido a la violación de la restricción única en el campo email.
Índices parciales únicos
Los índices parciales solo indexan los documentos de una colección que cumplen una expresión de filtro especificada. Si se especifican tanto partialFilterExpression como una restricción única, esta última solo se aplica a los documentos que cumplen la expresión de filtro.
Un índice parcial con una restricción única no impide la inserción de documentos que no cumplan con la restricción única si los documentos no cumplen con los criterios del filtro. Para un ejemplo, ver Índice parcial con restricción única.
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 de la clave del fragmento
un índice compuesto donde la clave del fragmento 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.
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
A partir de MongoDB,5.0 pueden existir índices básicos y únicos con el mismo patrón de clave.
Esta duplicación en los patrones de clave permite agregar un índice único a los campos que ya están indexados.
Por ejemplo, puede crear los dos índices siguientes que utilizan el mismo patrón de clave:
db.users.createIndex( { email : 1 }, { name: "basic_index" } )
db.users.createIndex( { email : 1 }, { name: "unique_index", unique: true } )