为什么在MongoDB Java驱动程序中忽略WriteConcern?

时间:2013-12-18 09:01:57

标签: java mongodb

我尝试使用MongoDB java驱动程序执行对db.collection.insert(List<DBObject>, WriteConcern)方法的阻塞调用。无论我在WriteConcern中使用什么:SAFEFSYNC_SAFEFSYNCEDACKNOWLEDGED,......我无法授予写入权限......至少不是我现在这样做的方式。检查代码:

WriteResult result = collection.insert(list, WriteConcern.FSYNC_SAFE);
if (result.getN()> 0){      
    System.out.println("Alleluyah!");
return true;
}

从我读过hereFSYNC_SAFE开始,应该是......数据正在被写入,但对result.getN()的调用始终为零。如果无法检查写入是否已完成......

为什么要首先创建getN()方法?我知道我做错了什么?我确实需要检查此插入是否已执行。我可以查询收集和检查,但它看起来有点过分给我了......

谢谢!

1 个答案:

答案 0 :(得分:4)

查看有关getN()方法的this帖子。它仅提供有关受更新或删除操作影响的文档数量的信息。

我不是专家,但在getLastError方法上考虑来自MongoDB wiki的这句话:

  

您实际上应该使用WriteConcern.ACKNOWLEDGED之类的写入问题,而不是手动调用getLastError()

据我所知,使用足够级别的WriteConcern并获得WriteResult表示操作成功且未发生错误。查看wiki中WriteConcern上的articlereference

由于您明确要验证插入操作是否正确执行,您可以执行以下操作:

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