Docs Menu
Docs Home
/ /

Unique Indexes

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.

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 } )

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 } )

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.

Tip

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.

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éplicas

  • Ejecuta db.collection.createIndex() en el mongos para un clúster particionado

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" ] } )

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.

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.

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 _id por defecto; sin embargo, el índice _id solo aplica la restricción de unicidad por fragmento si el campo _id no 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.

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.

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 } )

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" } )

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 } )

Volver

Datos expirados

Obtén una insignia de habilidad

¡Domina los "Fundamentos del diseño de indexación" gratis!

Más información

En esta página