按照JAVADOC , getN()
的方法WriteResult
MongoDB中的Java类返回在opertion更新文件的数量。 但它总是返回零,即使文件被正确地插入。
为什么这样? 或者我理解错误?
按照JAVADOC , getN()
的方法WriteResult
MongoDB中的Java类返回在opertion更新文件的数量。 但它总是返回零,即使文件被正确地插入。
为什么这样? 或者我理解错误?
我的印象是,这是正常的MongoDB的行为,并没有任何与Java驱动程序。
我可以在文档中找到的唯一的事情就是这样 :
getLastError.n报告的更新或删除的文档的数量,如果上述操作是更新或删除操作。
一个insert
既不的update
也不是remove
, n
似乎没有指定,并且0是一个很好的默认值作为任何。 您可以检查很容易敷在蒙戈外壳:
> db.test.insert({_id: 'test'})
> db.getLastErrorObj()
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 }
除非我记错了,这不是一个真正的问题:问一下自己在哪些情况下插入会失败(比,也就是说,一个连接失败等)。 我唯一能想到的是唯一性约束冲突,这将导致异常。 因此,几乎可以肯定,您将收到一个事实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至少公认一个MongoException将被抛出
您可能还需要检查http://docs.mongodb.org/manual/core/write-concern/
该dafault行为不使用“安全”写入关注