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

时间:2013-02-15 11:49:14

标签: mongodb mongodb-java

根据MongoDB-java中javaDocgetN()类的WriteResult方法,返回opertion中更新的文档数。 但即使正确插入文档,它也始终返回零。

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

3 个答案:

答案 0 :(得分:10)

我的印象是这是正常的MongoDB行为,与Java驱动程序无关。

我在文档中唯一能找到的是this

  

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

insert既不是update也不是removen似乎没有被指定,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。不是很干净,但它的行为与你期望的一样。

答案 1 :(得分:4)

请注意,无论MongoDB documentation状态如何,WriteResult.getN()方法始终为使用Java驱动程序插入返回0,无论插入的对象数是多少。设置" n"的源代码Java驱动程序2.12.3中的字段:

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。

答案 2 :(得分:1)

您可能还想查看 http://docs.mongodb.org/manual/core/write-concern/

默认行为是不使用“安全”writeconcern