我正在尝试使用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
看到该集合时,我没有看到更新的文档,它仍然显示旧文档。我已经仔细检查了我正在查看相同的集合,并且没有任何例外。我在这里做错了吗?
答案 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
保持不变,而当前代码不是这种情况,以及为什么查询与要更新的内容不匹配。