2012-08-30 47 views
23

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

Respuesta

38

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 hacerlo en múltiples campos. Consulte this section en los documentos para obtener más detalles y ejemplos.

índices MongoDB pueden imponer opcionalmente un única restricción de clave, lo que garantiza que ningún documento se insertan valores cuya indexados para las teclas de coincidir con los de un documento existente.

Si usted desea para null valores a ser ignorados por la clave única, entonces usted tiene que también hacen que el índice disperso (ver here), por, además de darle 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 MongoDB Java. Proveedores:

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

Nota: 'null' y none existe también cuenta como valores únicos así que si tienes una tabla de usuarios con algunos eliminados y por ley eliminas sus datos pero mantienes su fila para su eliminación futura tendrás problemas con índices únicos Supongo que es una necesidad realmente. – Sammaye

+2

@Sammaye: puede usar [índices dispersos] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-sparse%3Atrue) para resolver el problema con los campos null/missing. – Stennie

+0

+1 Se menciona en los documentos aquí, último párrafo para índices únicos: http://docs.mongodb.org/manual/core/indexes/#unique-index – theon

0

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

MongoDB por defecto tiene una clave principal conocido como el _id puede utilizar upsert() o save() en esta clave para evitar que el documento está escrito dos veces de esta manera:

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 duplicados. En cuanto a los insertos seguros de múltiples hilos bajo ciertas condiciones: bueno, necesitaríamos saber más acerca de su condición en ese caso.

Debo agregar, sin embargo, que el índice _id es independiente de forma predeterminada.

+0

Por qué la downvote? – Sammaye

+0

Typo, parece ... – Sammaye

0

solución Teón no funcionó para mí, pero éste lo hizo:

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

Esto se puede hacer utilizando 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 sabrá, la columna "_id" es única para cada entrada.

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

Ahora, hay otra entrada puede tener nombre como "Amit" en los collection.This puede ser una de la manera que usted está pidiendo.

1

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

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")); 
    } 
} 
Cuestiones relacionadas