MongoDB的:WriteResult.getN()总是返回0?(MongoDB: WriteRe

2019-07-19 23:15发布

按照JAVADOC , getN()的方法WriteResult MongoDB中的Java类返回在opertion更新文件的数量。 但它总是返回零,即使文件被正确地插入。

为什么这样? 或者我理解错误?

Answer 1:

我的印象是,这是正常的MongoDB的行为,并没有任何与Java驱动程序。

我可以在文档中找到的唯一的事情就是这样 :

getLastError.n报告的更新或删除的文档的数量,如果上述操作是更新或删除操作。

一个insert既不的update也不是removen似乎没有指定,并且0是一个很好的默认值作为任何。 您可以检查很容易敷在蒙戈外壳:

> db.test.insert({_id: 'test'})
> db.getLastErrorObj()
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 }

除非我记错了,这不是一个真正的问题:问一下自己在哪些情况下插入会失败(比,也就是说,一个连接失败等)。 我唯一能想到的是唯一性约束冲突,这将导致异常。 因此,几乎可以肯定,您将收到一个事实WriteResult ,在所有的实例表示操作成功,插入文档。

有两点要注意:

  • 我以前的观点的关键在于你的WriteConcern是足够高的错误报告。 如果您使用WriteConcern.NONE ,例如,没有例外,都不会得到提升。
  • 如果更新文件的数量是绝对必要的,你可以随时使用save的,而不是insert 。 不是很干净,但它的行为,你似乎期望的方式。


Answer 2:

需要注意的是,无论什么样的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将被抛出



Answer 3:

您可能还需要检查http://docs.mongodb.org/manual/core/write-concern/

该dafault行为不使用“安全”写入关注



文章来源: MongoDB: WriteResult.getN() always returns 0?