2016-04-20 8 views
0
zu arbeiten

Ich versuche, ein Dokument mit MongoDB Async Java-Treiber und mein Code unten zu aktualisieren,MongoDB Java Async Treiber replaceOne scheint nicht

// 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()); 
       } 
    }); 

Gemäß der Protokollierung ich das aktualisierte Dokument sehen wie unten,

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

Aber wenn ich die Sammlung über Robmongo sehe ich nicht das aktualisierte Dokument sehen und es zeigt immer noch das alte Dokument. Ich habe überprüft, dass ich in derselben Sammlung suche und es gibt keine Ausnahmen. Mache ich hier etwas falsch?

Antwort

1

Das Problem hierbei ist diese Zeile:

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

Wo Sie „dachte“ Sie ein „neues Dokument kopieren“ nur wurden die Zuweisung, aber eigentlich diese „auch“ modifiziert das document Objekt, das Feld anzuhängen.

Als solche wird die Abfrage nicht übereinstimmt, wie in der Ausgabe angezeigt:

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

Also, was Sie wollen, ist ein „Klon“. Es ist nicht einfach mit einem Document, kann aber mit diesem etwas „Hacky“ Verfahren erfolgen:

Document document = Document.parse(jsonString); 

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

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

Jetzt sehen Sie, dass newDocument den Zusatz enthält, während document unverändert bleibt, was nicht der Fall mit Ihrem aktuellen Code ist und warum die Abfrage keinem zu aktualisierenden Ergebnis entspricht.