[英]Java async driver for MongoDB doesn't work on replica set when “primary” is changed
[英]MongoDB Java Async Driver replaceOne doesn't seem to work
我正在嘗試使用MongoDB Async Java驅動程序更新文檔,下面是我的代碼,
// 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
看到收藏集時,看不到更新的文檔,它仍然顯示舊文檔。 我已經仔細檢查過我正在尋找同一個收藏,也沒有任何例外。 我在這里做錯什么了嗎?
這里的問題是這一行:
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
保持不變,當前代碼不是這種情況,以及查詢與任何要更新的內容都不匹配的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.