mongoDB中重复键的错误处理

时间:2014-06-16 13:32:44

标签: mongodb error-handling indexing

我在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并且它有自动upsert。

我该如何管理?

并且总计mongoDB中错误处理的最佳方法是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

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

1)运行'逐个选择',如果这样的文档已经存在 - 保存其ID

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

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