在MongoDB 3.2中创建索引以避免重复的文档/行

wlwcrazw  于 2022-12-03  发布在  Go
关注(0)|答案(2)|浏览(174)

我正在使用MongoDB 3.2,并希望避免在我的集合中出现重复项。为了做到这一点,我使用了createIndex()方法(我尝试了不同的变体,没有一个不起作用):

dbColl.createIndex(new Document("guid", 1));
dbColl.createIndex(new BasicDBObject("guid", 1));
dbColl.createIndex(new Document("guid.content", 1));
dbColl.createIndex(new BasicDBObject("guid.content", 1));

然后,我尝试使用以下命令执行数据插入:

itemsArr.forEach(
    item -> dbColl.insertOne(Document.parse(item.toString()))
);

我这样做了两次,并预计第二次MongoDB不会添加任何新行,因为数据已经添加,并且guid字段上有索引。但情况并非如此,MongoDB添加重复项时不考虑索引值。
为什么即使guid和/或guid.content字段上有索引,MongoDB也会添加重复项?如何解决这个问题?我希望能够只添加一次具有相同guid字段的文档。
以下是文档结构的示例:

在我的数据中,guid字段是唯一的文档标识符。

yqkkidmi

yqkkidmi1#

常规索引允许多个文档具有相同的值。
您需要的不是常规索引而是an unique index,它们是通过使用方法createIndex(DBObject keys, DBObject options)和options-object创建的,其中uniquetrue

collection.createIndex(new BasicDBObject("guid", 1), new BasicDBObject("unique", true));
kx7yvsdv

kx7yvsdv2#

Phillip的帮助下,我为***MongoDB 3.2***for***Java Driver 3.2.0***中的问题如何避免重复/在插入时跳过重复编写了一个完整的工作解决方案:

IndexOptions options = new IndexOptions();

    // ensure the index is unique
    options.unique(true);
    // define the index
    dbColl.createIndex(new BasicDBObject("guid", 1), options);

    // add data to DB
    for (Object item : itemsArr) {

        // if there is a duplicate, skip it and write to a console (optionally)
        try {
            dbColl.insertOne(Document.parse(item.toString()));
        } catch (com.mongodb.MongoWriteException ex) {
            //System.err.println(ex.getMessage());
        }
    }

您可以随时使用这款即用型解决方案。

相关问题