Подтвердить что ты не робот

Mongodb избегать дубликатов записей

Я новичок в mongodb. Могу ли я знать, как избежать дублирования записей. В реляционных таблицах мы используем первичный ключ, чтобы избежать этого. Могу ли я узнать, как указать его в Mongodb с помощью java?

4b9b3361

Ответ 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);