12

根据javaDoc,MongoDB-javagetN()中的类方法返回操作中更新的文档数。WriteResult但它总是返回零,即使文档插入正确。

为什么这样?还是我理解错了?

4

3 回答 3

10

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

我在文档中唯一能找到的

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

insert既不是 an也不update是 a removen似乎没有被指定,并且 0 与任何默认值一样好。您可以在 mongo shell 中轻松检查它:

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

除非我弄错了,否则这不是一个真正的问题:问问自己在什么情况下插入会失败(比如连接失败)。我能想到的唯一一个是违反唯一性约束,这将导致异常。所以几乎按照定义,你收到一个WriteResult实例就意味着操作成功并且插入了一个文档。

几点注意事项:

  • 我之前的论点取决于您WriteConcern足够高以至于报告错误。例如,如果您使用WriteConcern.NONE,则不会引发任何异常。
  • 如果更新文档的数量对您来说是绝对必要的,您可以随时使用save而不是insert. 不是很干净,但它的行为方式与您似乎期望的一样。
于 2013-09-06T14:19:38.260 回答
5

请注意,无论MongoDB 文档说明什么,WriteResult.getN()方法总是返回 0 以使用 Java 驱动程序进行插入,无论插入的对象数量如何。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

于 2015-01-15T18:38:39.770 回答
1

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

默认行为是不使用“安全”写关注

于 2013-09-06T13:15:33.873 回答