"Tutorial de introducción a MongoDB" Capítulo 30 Índice único

Este artículo presentará el índice único de MongoDB, que se puede usar para garantizar la unicidad de los valores de campo del documento.

índice único

Muchas veces necesitamos asegurar la unicidad del valor de un campo en un documento, como el correo electrónico o el nombre de usuario. Un índice único (único índice) puede ayudarnos a implementar tales reglas comerciales. De hecho, MongoDB utiliza un índice único para garantizar la unicidad de la clave principal _id.

El método para crear un índice único es el mismo que el de un índice normal, solo se debe especificar adicionalmente la opción {único: verdadero}:

db.collection.createIndex({
    
     field: 1}, {
    
    unique: true});

ejemplo de índice

Primero, cree una nueva colección de usuarios e inserte algunos documentos:

db.users.insertMany([
   {
    
     name: "张三", dob: "1990-01-01", email: "[email protected]"},
   {
    
     name: "李四", dob: "1992-06-30", email: "[email protected]"}
]);

Luego, creamos un índice único basado en el campo de correo electrónico:

db.users.createIndex({
    
    email:1},{
    
    unique:true});

A continuación intentamos insertar un documento existente:

db.users.insertOne(
    {
    
     name: "张叁", dob: "1995-03-12", email: "[email protected]"}
);

En este punto, MongoDB devolverá el siguiente error:

MongoServerError: E11000 duplicate key error collection: book.users index: email_1 dup key: {
    
     email: '[email protected]' }

Demostremos cómo crear un índice único cuando ya hay datos duplicados en la colección. Primero suelte y reconstruya los usuarios de la colección:

db.users.drop()

db.users.insertMany([
   {
    
     name: "张三", dob: "1990-01-01", email: "[email protected]"},
   {
    
     name: "张叁", dob: "1995-03-12", email: "[email protected]"},
   {
    
     name: "李四", dob: "1992-06-30", email: "[email protected]"}
]);

Luego, cree un índice único basado en el campo de correo electrónico:

db.users.createIndex({
    
    email: 1},{
    
    unique:true})

MongoServerError: Index build failed: 95f78956-d5d0-4882-bfe0-2d856df18c61: Collection book.users ( 6da472db-2884-4608-98b6-95a003b4f29c ) :: caused by :: E11000 duplicate key error collection: mflix.users index: email_1 dup key: {
    
     email: zhangsan@test.com }

El motivo del error anterior es que hay registros duplicados en el correo electrónico.

Por lo general, creamos un índice único antes de insertar datos, lo que puede garantizar la unicidad de los datos desde cero. Si crea un índice único basado en datos existentes, la creación del índice puede fallar debido a datos duplicados. Para hacer esto, necesitamos eliminar los datos duplicados antes de crear el índice.

Por ejemplo, podemos eliminar primero a los usuarios duplicados:

db.users.deleteOne({
    
     name: "张叁", dob: "1995-03-12", email: "[email protected]"});

{
    
     acknowledged: true, deletedCount: 1 }

Luego cree un índice único basado en el campo de correo electrónico:

db.users.createIndex({
    
    email: 1},{
    
    unique:true})

email_1

índice único compuesto

Un índice único basado en varios campos es un índice compuesto único. Los índices únicos compuestos pueden garantizar que la combinación de varios valores de campo sea única. Por ejemplo, para crear un índice único compuesto basado en los campos campo1 y campo2, los siguientes datos son únicos:

campo1 campo2 combinación
1 1 (1,1)
1 2 (1,2)
2 1 (2,1)
2 2 (2,2)

Los siguientes datos tienen valores duplicados:

campo1 campo2 combinación
1 1 (1,1)
1 1 (1,1) se repite
2 1 (2,1)
2 1 (2,1) se repite

A continuación, veamos un ejemplo, primero cree una ubicación de colección.

db.locations.insertOne({
    
    
	address: "北京市丰台区莲花池东路118号北京西站",
	latitude: 39.894793,
	longitude: 116.321592
})

Luego, cree un índice único compuesto basado en la latitud y la longitud:

db.locations.createIndex({
    
    
	latitude: 1,
	longitude: 1
},{
    
     unique: true });

'latitude_1_longitude_1'

Inserta una ubicación con la misma longitud:

db.locations.insertOne({
    
    
	address: "北京市海淀区复兴路甲9号中华世纪坛",
	lat: 39.910577,
	long: 116.321592
})

La operación tuvo éxito porque el índice compuesto latitude_1_longitude_1 verifica el valor combinado de longitud y latitud.

Finalmente, inserte un lugar con una latitud y longitud existentes:

db.locations.insertOne({
    
    
	address: "北京市丰台区莲花池东路118号北京西站",
	latitude: 39.894793,
	longitude: 116.321592
})

En este punto, MongoDB devuelve un error de clave duplicada:

MongoServerError: E11000 duplicate key error collection: book.locations index: latitude_1_longitude_1 dup key: {
    
     lat: 39.894793, long: 116.321592 }

Supongo que te gusta

Origin blog.csdn.net/horses/article/details/129201604
Recomendado
Clasificación