【问题标题】:error handling for duplicate key in mongoDBmongoDB中重复键的错误处理
【发布时间】:2014-06-17 00:13:34
【问题描述】:

我在 mongoDB 中有一个集合。我在它的“word”字段上创建了一个唯一索引。

我有一个类似下面的添加到集合的方法:

private boolean add(String word, Map<String, Integer> docOccurrence, Map<String, Integer> totalOccurrence) {
    db.requestStart();
    BasicDBObject document = new BasicDBObject();
    document.put(DB_COLLECTION_WORD_CAT_COL_WORD, SQLQueryValidation.validateBeforeWrite(word));
    document.put(DB_COLLECTION_WORD_CAT_COL_DOC_OCCURRENCE, new BasicDBObject(docOccurrence));
    document.put(DB_COLLECTION_WORD_CAT_COL_TOTAL_OCCURRENCE, new BasicDBObject(totalOccurrence));
    try {
        synchronized (LOCK_WRITE) {
            table.save(document, WriteConcern.SAFE);
            //System.out.println(wr.getField("ok"));
        }
    } catch (MongoException e) {
        System.out.println("heh");
        logger.error("Could not insert new row to word_cat : {}", e.getMessage());
        return false;
    }
    return true;
}

但是如果我插入一个重复的词,我会得到这个错误!

 Could not insert new row to word_cat : insertDocument :: caused by :: 11000 E11000       duplicate key error index: cat.word_cat_english.$word_1  dup key: {"test_word" }

我希望它没有问题,因为使用 .save 而不是 .insert

我已经用过 Cassandra,它有自动更新插入功能。

我该如何管理它?

在 mongoDB 中错误处理的最佳方式是什么?

谢谢。

【问题讨论】:

  • MongoDB“保存”对文档的_id值进行了操作。因此,在您的情况下,如果您将 _id 值设置为最初插入的值,它只会更新原始文档。处理此问题的一种可能方法是自己将 _id 设置为 WORD 值,因为这对您的数据模型和用例有意义。

标签: mongodb error-handling indexing


【解决方案1】:

我在上面第二个'zsh'的答案。换句话说,mongo 是如何猜测您是错误地尝试插入重复项,还是尝试更新现有数据。 我会:

1) 运行“按单词选择”,如果这样的文档已经存在 - 用它的 ID 保存

2) 使用 mongo upsert : http://docs.mongodb.org/manual/reference/method/db.collection.update/

提醒一句,当我使用 spring-data-mongo 时,第二种方法更“低级”而不是“面向对象”,例如spring 实现不会调度事件,也不会执行乐观更新(尽管您可能想仔细检查一下,我使用的是旧版本)。

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 2017-02-20
    • 2019-05-03
    • 2018-10-12
    • 2015-05-01
    • 2018-10-13
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多