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