Sono novizio di mongodb. Posso sapere come evitare le voci duplicate. Nelle tabelle relazionali, usiamo la chiave primaria per evitarlo. Posso sapere come specificarlo in Mongodb usando java?Mongodb evitare le voci duplicate
risposta
Utilizzare un indice con l'opzione {unique:true}
.
// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});
È anche possibile farlo su più campi. Vedere this section nei documenti per ulteriori dettagli ed esempi.
indici MongoDB possono facoltativamente imporre un unico vincolo di chiave, che garantisce che nessun documento vengono inseriti valori cui le chiavi indicizzati corrispondere a quelli di un documento esistente.
Se si desidera per null
valori siano ignorati dalla chiave univoca, allora si deve fare anche l'indice di scarsa (vedere here di), aggiungendo anche l'opzione 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});
Se si desidera creare l'indice utilizzando il driver Java MongoDB. Prova:
Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));
Non sono un programmatore Java, tuttavia è possibile che si riesca a convertirlo.
MongoDB per default ha ancora una chiave primaria noto come il _id
è possibile utilizzare upsert()
o save()
su questo tasto per evitare che il documento venga scritto due volte in questo modo:
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
Questo fermerà immediatamente duplicati. Per quanto riguarda gli inserti sicuri multithread in determinate condizioni: beh, avremmo bisogno di sapere di più sulla tua condizione in quel caso.
Devo tuttavia aggiungere che l'indice _id
non è corretto per impostazione predefinita.
soluzione Theon non ha funzionato per me, ma questo fatto:
BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);
Questo può essere fatto utilizzando il campo "_id", anche se questo uso è sconsigliato. Supponiamo che tu voglia che i nomi siano univoci, quindi puoi mettere i nomi nella colonna "_id" e come potresti sapere la colonna "_id" è unica per ogni voce.
BasicDBObject bdbo = new BasicDBObject("_id","amit");
Ora, nessun altra voce può avere nome come "Amit" nei collection.This può essere uno dei modi si sta chiedendo.
A partire dal conducente Java v3.0 di Mongo, il codice per creare l'indice si presenta come:
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"));
}
}
- 1. Rimuovere le voci duplicate consecutive
- 2. Ignorare le voci duplicate nella matrice sparse
- 3. HashSet contiene voci duplicate
- 4. Voci duplicate in ListView
- 5. voci multi colonna duplicate postgresql
- 6. Voci di registro duplicate log4j
- 7. Evita voci duplicate sull'array Mongoose
- 8. Duplicherà le chiamate addEventListener per creare voci di listener duplicate?
- 9. Rimuovere le voci duplicate utilizzando uno script Bash
- 10. Come rimuovere le voci duplicate modulo ArrayList in java
- 11. In che modo PriorityQueue in Java ordina le voci duplicate?
- 12. Eliminare le voci duplicate da una casella di selezione
- 13. Come rimuovere le voci duplicate da un array?
- 14. Prevenire le voci duplicate in matrice in schema Mongoose
- 15. Perché l'unione non funziona in LINQ rimuovere le voci duplicate?
- 16. Evita l'attività cssmin di Grunt per rimuovere le voci duplicate
- 17. Ricerca di voci duplicate nella raccolta
- 18. Python: rimozione di voci CSV duplicate
- 19. Rimozione di voci duplicate in Array - Java
- 20. Ottenimento di voci duplicate utilizzando Hibernate
- 21. Solr non sovrascrive - voci univoche duplicate
- 22. git tree contiene voci di file duplicate
- 23. Combinazione di voci duplicate con dati univoci in Excel
- 24. db.cloneCollection ignora le chiavi duplicate
- 25. Avvio attività tramite notifica: evitare attività duplicate
- 26. Evitare risorse duplicate nel progetto Android
- 27. Ember dati non consente voci duplicate nei rapporti hasMany
- 28. SQLite: Prevenire le righe duplicate
- 29. HashSet aggiunge voci duplicate nonostante attuazione sia hashCode() e equals()
- 30. Errore di handle per voci duplicate - PHP MySQL
Nota: 'null' e nessuno esistente vale come valori univoci quindi se hai una tabella di utenti con alcuni cancellati e per legge rimuovi i loro dati ma mantieni la riga per la cancellazione futura avrai problemi con indici unici. Immagino che sia davvero necessario. – Sammaye
@Sammaye: è possibile utilizzare [sparse indexes] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-sparse%3Atrue) per risolvere il problema con campi nulli/mancanti. – Stennie
+1 È menzionato nei documenti qui, ultimo paragrafo per gli indici unici: http://docs.mongodb.org/manual/core/indexes/#unique-index – theon