Mhidy Mhidy - 1 month ago 22
Java Question

MongoDB Java Driver updates unmatched sub-document

I'm using

mongo-java-driver:3.3.0
and trying to update one value of my sub-document using $inc operator and findOneAndUpdate, but only under certain conditions (id comparison and greaterThan filter).

Following is a snippet to reproduce the problem:

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 }
]
}


What I expected is count:13 on the second subdoc (id:"BBB"), but I got an update on the first one (count:3).

This works fine if I remove greaterThan condition line (.. new Document("$gt", 5) ..):

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


What I'm doing wrong?

Thanks!

Answer

Here is the java equlivant for $elemMatch.

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