Mongodb избегать повторяющихся записей

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

5 ответов


используйте индекс с .

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

вы также можете сделать это по нескольким полям. посмотреть в этом разделе в документах для получения более подробной информации и примеров.

индексы MongoDB могут дополнительно вводить ограничение уникального ключа, что гарантирует отсутствие вставленных документов, значения которых для индексированных ключей соответствуют значениям существующего документа.

если вы желаете null значения, которые следует игнорировать из уникального ключа, тогда вы также должны сделать индекс разреженным (посмотреть здесь), путем добавления :

// 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});

если вы хотите создать индекс с помощью драйвера MongoDB Java. Попробуйте:

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

Это можно сделать с помощью поля "_id", хотя это использование не рекомендуется. предположим, вы хотите, чтобы имена были уникальными, тогда вы можете поместить имена в столбец "_id", и, как вы знаете, столбец" _id " уникален для каждой записи.

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

теперь никакая другая запись не может иметь имя как "amit" в коллекции.Это может быть один из способов, о котором вы просите.


по состоянию на v3 Монго.0 Java-драйвер, код для создания индекса выглядит так:

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

решение Теона не сработало для меня, но это сработало:

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

Я не программист 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 индекс по умолчанию unqiue.