我在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中错误处理的最佳方法是什么?
感谢。
答案 0 :(得分:0)
我在上面的第二个'zsh'的回答。换句话说,mongo如何猜测您是否错误地尝试插入重复项或尝试更新现有数据。 我要么:
1)运行'逐个选择',如果这样的文档已经存在 - 保存其ID
2)使用mongo upsert: http://docs.mongodb.org/manual/reference/method/db.collection.update/
只是一句警告,当我使用spring-data-mongo时,第二种方法更“低级”而不是“面向对象”,例如spring实现不会调度事件,也不会执行乐观更新(尽管您可能需要仔细检查,我使用的是旧版本)。