Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:WriteResult.getN()是否始终返回0?_Mongodb_Mongodb Java - Fatal编程技术网

MongoDB:WriteResult.getN()是否始终返回0?

MongoDB:WriteResult.getN()是否始终返回0?,mongodb,mongodb-java,Mongodb,Mongodb Java,根据MongoDB java中的WriteResult类的getN()方法,返回操作中更新的文档数。 但它总是返回零,即使文档插入正确 为什么会这样?还是我理解错了?您也可以检查一下 dafault行为不是使用“安全”写关注点,我的印象是这是正常的MongoDB行为,与Java驱动程序无关 我在文档中唯一能找到的是: 如果前面的操作是更新或删除操作,则getLastError.n报告更新或删除的文档数 insert既不是update也不是remove,n似乎没有指定,0是与任何值一样好的默认值

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


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

您也可以检查一下


dafault行为不是使用“安全”写关注点,我的印象是这是正常的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 }
除非我弄错了,否则这不是一个真正的问题:问问自己在什么情况下插入会失败(比如说,连接失败除外)。我能想到的唯一一个方法是违反单一性约束,这将导致异常。因此,几乎按照定义,您收到一个
WriteResult
实例这一事实意味着操作成功并插入了一个文档

几点注意:

  • 我之前的论点取决于您的
    WriteConcern
    是否足够高,以至于会报告错误。例如,如果您使用的是
    WriteConcern.NONE
    ,则不会引发异常
  • 如果更新文档的数量对您来说是绝对必需的,您可以始终使用
    save
    而不是
    insert
    。不是很干净,但它的行为方式,你似乎期待

请注意,无论状态如何,对于使用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,因为它工作正常。您正在使用哪个mongo版本?执行此操作后,文档是否正确插入数据库?是,文档插入正确!Mongo版本:2.2.2我也发现了同样的问题。它正在返回0。请看这里,你能添加一个失败的测试和示例数据来显示问题吗?@Trisha这不是一个错误的行为。getN()仅在更新时返回文档计数,对于insert,它始终返回0。我认为这种行为存在问题,因为
getN()的Javadoc表示“获取”n字段,其中包含写入操作中受影响的文档数。。如果您执行了一个测试,了解是否有任何更改是很有价值的,然后使用
getN()
总是返回0,从而在应用程序中引入错误。一个合理的解决方案(除了纠正Javadoc之外)可以是使
getN()
抛出一个插入异常,或者首先不包含该方法@Zero3无序插入比此答案更新。另外,WriteResult包括2.6版以来插入的文档数,我相信您只需要使用正确的名称调用getField。最后,最新的javadoc没有说明n字段是什么,它只是说“获取n字段”。虽然这不是非常有用,但也几乎没有错。如果您查看n字段的官方mongodb文档,很明显插入将产生一个0的n值-也许不是最好的行为,但根据规范是正确的。只需使用正确的字段。在最新版本中没有这样的功能,
getN()
的描述与我写的一模一样。亲自检查:)。当然可以成功后,WriteResult对象包含有关插入文档数量的信息。关于
getN
位,您是对的,我错误地认为最新的javadoc版本是2.6.right,所以对于无序插入,您希望使用,通过获取,最终生成一个,它有一个方法。