根据javaDoc,MongoDB-java中WriteResult类的getN()方法返回操作中更新的文档数。但是,即使文档插入正确,它也总是返回零。
为什么会这样呢?还是我理解错了?
发布于 2013-09-06 22:19:38
我的印象是,这是正常的MongoDB行为,与Java驱动程序无关。
我在文档中唯一能找到的就是this
如果前面的操作是update或remove操作,
getLastError.n会报告更新或删除的文档数量。
insert既不是update,也不是remove,似乎没有指定n,0和any一样是默认值。您可以在mongo shell中很容易地检查它:
> db.test.insert({_id: 'test'})
> db.getLastErrorObj()
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 }除非我错了,否则这并不是真正的问题:问问自己在什么情况下插入会失败(除了连接失败)。我唯一能想到的就是违反单一性约束,这将导致异常。因此,几乎根据定义,接收到WriteResult实例就意味着操作成功并插入了文档。
以下是几个注意事项:
WriteConcern是否足够高,以至于报告了错误。例如,如果您使用的是WriteConcern.NONE,则不会引发任何异常。save而不是insert。不是很干净,但它的行为符合您的预期。发布于 2015-01-16 02:38:40
请注意,无论MongoDB documentation的状态如何,对于使用Java驱动程序的insert,WriteResult.getN()方法始终返回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
发布于 2013-09-06 21:15:34
您可能还想检查http://docs.mongodb.org/manual/core/write-concern/
dafault行为不是使用“安全”的写入关注点。
https://stackoverflow.com/questions/14894101
复制相似问题