ejemplo java mongodb mongodb-java

java - ejemplo - Mongodb evitar entradas duplicadas



mongodb to java class (5)

Soy novato en mongodb. Puedo saber cómo evitar entradas duplicadas. En las tablas relacionales, usamos clave primaria para evitarlo. ¿Puedo saber cómo especificarlo en mongodb usando java?


A partir del controlador Java v3.0 de Mongo, el código para crear el índice es el siguiente:

public void createUniqueIndex() { Document index = new Document("fieldName", 1); MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName"); collection.createIndex(index, new IndexOptions().unique(true)); } // And test to verify it works as expected @Test public void testIndex() { MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName"); Document newDoc = new Document("fieldName", "duplicateValue"); collection.insertOne(newDoc); // this will throw a MongoWriteException try { collection.insertOne(newDoc); fail("Should have thrown a mongo write exception due to duplicate key"); } catch (MongoWriteException e) { assertTrue(e.getMessage().contains("duplicate key")); } }


Esto se puede hacer usando el campo "_id" aunque este uso no se recomienda. Supongamos que desea que los nombres sean únicos, luego puede poner los nombres en la columna "_id" y, como es de saber, la columna "_id" es única para cada entrada.

BasicDBObject bdbo = new BasicDBObject("_id","amit");

Ahora, ninguna otra entrada puede tener un nombre como "amit" en la colección. Esta puede ser una de las formas que está solicitando.


La solución de Theon no funcionó para mí, pero esta sí:

BasicDBObject query = new BasicDBObject(<fieldname>, 1); collection.ensureIndex(query, <index_name>, true);


No soy un programador de Java, sin embargo, probablemente puedas convertir esto.

De forma predeterminada, MongoDB tiene una clave principal conocida como _id que puede usar upsert() o save() en esta clave para evitar que el documento se escriba dos veces, así:

var doc = {''name'': ''sam''}; db.users.insert(doc); // doc will get an _id assigned to it db.users.insert(doc); // Will fail since it already exists

Esto detendrá inmediatamente los duplicados. En cuanto a las inserciones de seguridad multiproceso bajo ciertas condiciones: bueno, en ese caso necesitaríamos saber más sobre su condición.

Debo agregar, sin embargo, que el índice _id es unqiue por defecto.


Utilice un índice con la opción {unique:true} .

// everyone''s username must be unique: db.users.createIndex({email:1},{unique:true});

También puede hacer esto en múltiples campos. Consulte esta sección en la documentación para obtener más detalles y ejemplos.

Los índices de MongoDB pueden imponer opcionalmente una restricción de clave única , que garantiza que no se inserten documentos cuyos valores para las claves indexadas coincidan con los de un documento existente.

Si desea que se ignoren los valores null de la clave única, también debe hacer que el índice sea disperso ( vea here ), agregando también la opción sparse :

// everyone''s username must be unique, //but there can be multiple users with no email field or a null email: db.users.createIndex({email:1},{unique:true, sparse:true});

Si desea crear el índice utilizando el controlador Java MongoDB. Tratar:

Document keys = new Document("email", 1); collection.createIndex(keys, new IndexOptions().unique(true));