Я использую mongo-java-driver:3.3.0
и пытаюсь обновить одно значение моего поддоку с помощью оператора $ inc и findOneAndUpdate, но только при определенных условиях (сравнение идентификаторов и фильтр большего размера).MongoDB Java Driver обновляет непревзойденный субдокумент
Ниже приведен фрагмент кода, чтобы воспроизвести проблему:
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 }
]
}
Что я ожидал это отсчет: 13 на втором subdoc (id: «BBB»), но я получил обновление по первому (счет: 3).
Это прекрасно работает, если удалить GreaterThan состояние линии (.. новый документ ("$ GT", 5) ..):
{ "_id" : { "$oid" : "5819c92577a8cb13404cfc91" },
"subdocs" : [
{ "id" : "AAA", "count" : 10 },
{ "id" : "BBB", "count" : 13 }
]
}
Что я делаю неправильно?
Спасибо!
Вам нужно использовать $ elemMatch, если у вас есть два разных условия для массива subdocs. Однако я не знаком с синтаксисом mongodb-java, поэтому я надеюсь, что кто-то еще сможет написать полный ответ. –
Используя '$ elemMatch', все работает так, как ожидалось. Я не могу голосовать за ваш комментарий, вызывать мою репутацию. Я напишу ответ на свой вопрос. – Mhidy