Я новичок в mongodb. Могу ли я знать, как избежать дублирования записей. В реляционных таблицах мы используем первичный ключ, чтобы избежать этого. Могу ли я узнать, как указать его в Mongodb с помощью java?
Mongodb избегать дубликатов записей
Ответ 1
Используйте индекс с опцией {unique:true}
.
// everyone username must be unique:
db.users.createIndex({email:1},{unique:true});
Вы также можете сделать это через несколько полей. См. этот раздел в документах для получения более подробной информации и примеров.
Индексы MongoDB могут необязательно устанавливать уникальное ограничение ключа, которое гарантирует, что никакие документы не будут вставлены, чьи значения для индексированных ключей совпадают с значениями существующего документа.
Если вы хотите, чтобы значения null
игнорировались из уникального ключа, вам также нужно сделать индекс редким (см. здесь), добавив опцию sparse
:
// everyone 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});
Если вы хотите создать индекс, используя драйвер Java MongoDB. Попробуйте:
Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));
Ответ 2
Это можно сделать, используя поле "_id" , хотя это использование не рекомендуется. предположим, что вы хотите, чтобы имена были уникальными, тогда вы можете поместить имена в столбец "_id" , и, как вы знаете, столбец "_id" уникален для каждой записи.
BasicDBObject bdbo = new BasicDBObject("_id","amit");
Теперь никакая другая запись не может иметь имя как "amit" в коллекции. Это может быть один из способов, о которых вы просите.
Ответ 3
По сравнению с Java-драйвером Mongo v3.0 код для создания индекса выглядит следующим образом:
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"));
}
}
Ответ 4
Я не программист на Java, но вы можете, вероятно, преобразовать это.
MongoDB по умолчанию имеет первичный ключ, известный как _id
, который вы можете использовать upsert()
или save()
на этом ключе, чтобы документ не записывался дважды:
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
Это немедленно остановит дубликаты. Что касается многопоточных безопасных вставок при определенных условиях: ну, в этом случае нам нужно будет узнать больше о вашем состоянии.
Однако я должен добавить, что индекс _id
по умолчанию не имеет значения.
Ответ 5
Решение Theon не работало для меня, но это делало:
BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);