2016-11-02 1 views
1

Ich benutze mongo-java-driver:3.3.0 und versuche, einen Wert meines Unterdokuments mit $ inc operator und findOneAndUpdate zu aktualisieren, aber nur unter bestimmten Bedingungen (id Vergleich und gr ?? erer Filter).MongoDB Java Treiber aktualisiert nicht übereinstimmendes Unterdokument

Es folgt ein Ausschnitt, das Problem zu reproduzieren:

MongoCollection<Document> coll = db.getCollection("update_increase"); 

    Document docBefore = new Document() 
     .append("subdocs", Arrays.asList(
      new Document("id", "AAA").append("count", 10), 
      new Document("id", "BBB").append("count", 20) 
    )); 
    coll.insertOne(docBefore); 

    Document filter = new Document() 
     .append("subdocs.id", "BBB") 
     .append("subdocs.count", new Document("$gt", 7)); 

    Document update = new Document() 
     .append("$inc", new Document("subdocs.$.count", -7)); 

    Document docAfter = coll.findOneAndUpdate(
     filter, 
     update, 
     new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)); 

docBefore:

{ "_id" : { "$oid" : "5819c85977a8cb12f8d706c9" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 10 }, 
     { "id" : "BBB", "count" : 20 } 
    ] 
} 

docAfter:

{ "_id" : { "$oid" : "5819c85977a8cb12f8d706c9" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 3 }, 
     { "id" : "BBB", "count" : 20 } 
    ] 
} 

Was erwartete ich ist Zahl: 13 auf der zweiten SubDoc (id: "BBB"), aber ich habe ein Update auf den ersten bekommen (Anzahl: 3).

Dies funktioniert gut, wenn ich greaterThan Zustand Leitung (.. neue Dokument ("$ gt", 5) ..) entfernen:

{ "_id" : { "$oid" : "5819c92577a8cb13404cfc91" }, 
    "subdocs" : [ 
     { "id" : "AAA", "count" : 10 }, 
     { "id" : "BBB", "count" : 13 } 
    ] 
} 

Was mache ich falsch?

Danke!

+1

Sie müssen $ elemMatch verwenden, wenn Sie im Array subdocs zwei verschiedene Bedingungen haben. Ich bin jedoch nicht mit der mongodb-Java-Syntax vertraut, daher hoffe ich, dass jemand anderes eine vollständige Antwort schreiben kann. –

+0

Mit '$ elemMatch' funktioniert alles wie erwartet. Ich kann deinen Kommentar nicht wählen, meinen Ruf verursachen. Ich werde eine Antwort für meine Frage schreiben. – Mhidy

Antwort

0

Hier ist der Java Equlivant für $ elemMatch.

Document filter = new Document("subdocs", new Document().append("$elemMatch", new Document().append("id", "BBB").append("count", new Document("$gt", 7)))); 
+0

Ich schrieb eine Antwort auf meine Frage, wie von Vince Bowdren in seinem Kommentar vorgeschlagen. Aber du warst schneller als ich:) Danke Jungs! – Mhidy

Verwandte Themen