MongoDB Java异步驱动程序replaceOne似乎无法正常工作

时间:2016-04-20 01:15:06

标签: java mongodb java-8 mongodb-query

我正在尝试使用MongoDB Async Java Driver更新文档,我的代码如下,

// jsonString is a string of "{_id=5715e426ed3522391f106e68, name=Alex}
final Document document = Document.parse(jsonString);

Document newDocument = document.append("status", "processing");
mongoDbCollection.replaceOne(document, newDocument, (updateResult, throwable) -> {
              if (updateResult != null) {
                 log.info("UPDATED DOC ::::::>>> " + newDocument.toJson());
                 log.info("UPDATED RESULT ::::>> "+updateResult.toString());
              } else {
                 throwable.printStackTrace();
                 log.error(throwable.getMessage());
              }
   });

根据日志记录,我确实看到了如下的更新文档,

INFO: UPDATED DOC ::::::>>> { "_id" : { "$oid" : "5715e426ed3522391f106e68" }, "status":"processing"}
INFO: UPDATED RESULT ::::>> AcknowledgedUpdateResult{matchedCount=0, modifiedCount=0, upsertedId=null}

但是当我通过Robmongo看到该集合时,我没有看到更新的文档,它仍然显示旧文档。我已经仔细检查了我正在查看相同的集合,并且没有任何例外。我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

这里的问题是这一行:

Document newDocument = document.append("status", "processing");

你在哪里思考"你只是分配一个"新的文件副本",但实际上这个"也是"修改document对象以附加字段。

因此,查询不匹配,正如输出中所示:

{matchedCount=0, modifiedCount=0, upsertedId=null}
           // ^ Right here! See 0 matched

所以你想要的是一个"克隆"。使用Document并不简单,但可以稍微做一下" hacky"方法:

Document document = Document.parse(jsonString);

Document newDocument = Document.parse(document.toJson()).append("status","processing");

System.out.println(newDocument);
System.out.println(document);

现在您将看到newDocument包含添加,而document保持不变,而当前代码不是这种情况,以及为什么查询与要更新的内容不匹配。