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

标签 java mongodb

我正在尝试对 db.collection.insert(List<DBObject>, WriteConcern) 执行阻塞调用方法与 MongoDB java 驱动程序。无论我在 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()首先是方法??知道我做错了什么吗?我确实需要检查此插入是否已执行。我可以查询集合并进行检查,但它对我来说太过分了...

谢谢!

最佳答案

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

我不是专家,但考虑一下 MongoDB wiki 中关于 getLastError 方法的引述:

You should actually use a write concern like WriteConcern.ACKNOWLEDGED instead of calling getLastError() manually.

据我所知,使用足够级别的 WriteConcern 并返回 WriteResult 意味着操作成功并且没有发生错误。查看articlereference在 wiki 中的 WriteConcern 上也是如此。

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

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 - 为什么 WriteConcern 在 MongoDB Java 驱动程序中被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20653627/

相关文章:

sorting - MongoDB如何进行多键排序?

java - PaintComponent 没有在整个 JPanel 中绘制

java - 在 Spring Boot 的同一个 pom.xml 中管理 H2 和 Postgres

MongoDB 从文档中提取子数组

javascript - MongoDB + Express : How to verify login credentials using db. collection().findOne() 还是 .find()?

mongodb - 无法在 Rocketchat 配置中使用 Atlas DB

mongodb - Mongodb MapReduce 混淆

java - 访问被拒绝 - 获取文件属性?

java - IDEA 插件 : PersistentStateComponent not persisting xml

Java 静态 - 方法或字段?