我正在尝试使用MongoDB Java驱动程序执行对db.collection.insert(List<DBObject>, WriteConcern)
方法的阻塞调用。不管我在WriteConcern中使用什么:SAFE
,FSYNC_SAFE
,FSYNCED
,ACKNOWLEDGED
,...我不能授予已执行写入操作……至少不是我现在的操作方式。检查代码:
WriteResult result = collection.insert(list, WriteConcern.FSYNC_SAFE);
if (result.getN()> 0){
System.out.println("Alleluyah!");
return true;
}
从我读过的here,
FSYNC_SAFE
,应该是要走的路...正在写入数据,但对result.getN()
的调用始终为零。如果无法检查写入是否已完成...为什么要首先创建
getN()
方法?有什么想法我做错了吗?我确实需要检查此插入操作是否已执行。我可以查询集合并进行检查,但是对我来说似乎有点过头了...谢谢!
最佳答案
查看有关getN()
方法的this帖子。它仅提供有关受更新或删除操作影响的文档数的信息。
我不是专家,但可以考虑使用MongoDB Wiki上关于getLastError
方法的引用:
实际上,您应该使用像WriteConcern.ACKNOWLEDGED
这样的写关注点,而不是手动调用getLastError()
。
据我了解,使用足够级别的WriteConcern
并取回WriteResult
意味着该操作成功并且没有发生错误。还要在Wiki中的WriteConcern上查看article和reference。
由于您明确希望验证插入操作是否正确执行,因此可以执行以下操作:
WriteResult result = collection.insert(list, WriteConcern.FSYNC_SAFE);
CommanResult commandResult = result.getLastError();
if (commandResult.get("err") != null) {
System.out.println("Alleluyah");
return true;
}
使用
WriteConcern.FSYNC_SAFE
插入文档将调用getLastError()
方法-source。如果WriteConcern
的级别不够严格,调用getLastError()
可能导致错误-检查WriteResult code on github。如果没有发生错误,则err字段为null
,否则将包含错误消息-source。关于java - 为什么在MongoDB Java驱动程序中忽略WriteConcern?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20653627/