我尝试使用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()
方法?我知道我做错了什么?我确实需要检查此插入是否已执行。我可以查询收集和检查,但它看起来有点过分给我了......
谢谢!
答案 0 :(得分:4)
查看有关getN()
方法的this帖子。它仅提供有关受更新或删除操作影响的文档数量的信息。
我不是专家,但在getLastError
方法上考虑来自MongoDB wiki的这句话:
您实际上应该使用
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。如果没有发生错误,则错误字段为null
,否则将包含错误消息 - source。