根据 JAVADOC, getN()
的方法 WriteResult
MongoDB-java中的类返回opertion中更新的文档数。
但即使正确插入文档,它也始终返回零。
为什么这样?或者我错误地理解了?
根据 JAVADOC, getN()
的方法 WriteResult
MongoDB-java中的类返回opertion中更新的文档数。
但即使正确插入文档,它也始终返回零。
为什么这样?或者我错误地理解了?
我的印象是这是正常的MongoDB行为,与Java驱动程序无关。
我在文档中唯一能找到的是 这个:
如果前面的操作是更新或删除操作,则getLastError.n报告更新或删除的文档数。
一个 insert
既不是 update
也不是 remove
, n
似乎没有指定,0和任何默认值一样好。您可以在mongo shell中轻松检查它:
> db.test.insert({_id: 'test'})
> db.getLastErrorObj()
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 }
除非我弄错了,否则这不是一个问题:问问自己在什么情况下插入会失败(除了连接失败之外)。我能想到的唯一一个是违反unicity约束,这会导致异常。所以几乎按照定义,你收到的事实 WriteResult
实例表示操作成功并插入了文档。
几个笔记:
WriteConcern
足够高,报告错误。如果你正在使用 WriteConcern.NONE
例如,永远不会引发异常。save
代替 insert
。不是很干净,但它表现得像你期望的那样。注意,不管是什么 MongoDB文档 国家, WriteResult.getN() 无论插入的对象数是多少,对于使用Java驱动程序进行插入,方法始终返回0。在Java驱动程序的2.12.3中设置“n”字段的源代码:
if (type == INSERT) {
commandResult.put("n", 0);
} else if (type == REMOVE) {
commandResult.put("n", bulkWriteResult.getRemovedCount());
} else if (type == UPDATE || type == REPLACE) {
commandResult.put("n", bulkWriteResult.getMatchedCount() + bulkWriteResult.getUpserts().size());
if (bulkWriteResult.getMatchedCount() > 0) {
commandResult.put("updatedExisting", true);
} else {
commandResult.put("updatedExisting", false);
}
if (!bulkWriteResult.getUpserts().isEmpty()) {
commandResult.put("upserted", bulkWriteResult.getUpserts().get(0).getId());
}
}
但是错误是通过例外正确报告的。例如,如果指定的WriteConcern至少是ACKNOWLEDGED,则在插入违反唯一索引的文档时将抛出MongoException
您可能还想检查 http://docs.mongodb.org/manual/core/write-concern/
dafault行为不是使用“安全”写入问题