Обновить поле документа внутри массива массивов в mongodb - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть Document, у которого есть поле массива с именем listsOfItems. Его содержимое равно Documents, и все они содержат другое поле массива с именем setOfItems, которое состоит из Document.
Таким образом, структура имеет вид listsOfItems (массив Documents) > setOfItems (Массив Documents) > Items (Documents)

Каждый Document в listsOfItems имеет поле listId, которое используется для уникальной идентификации его содержимого.
Каждый Document в setOfItems имеет itemId поле, которое используется для однозначной идентификации его содержимого.

Я хочу изменить значение поля внутри Document из setOfItems с учетом listId и itemId.
В настоящее время я пытаюсь сделать это следующим образом:

final var filter = Filters.and(Filters.eq("accessDetail.email", email),
                Filters.eq("listsOfItems.listId", listId),
                Filters.eq("listsOfItems.$.setOfItems.itemId", itemId));
final var updateQuery = Updates.set("listsOfItems.$.setOfItems.obtained", BsonBoolean.TRUE);

usersCollection.findOneAndUpdate(filter, updateQuery)  

Запрос не соответствует ни одному Document
Я не могу получить доступ к элементамв setOfItems путем прямого доступа к ним по индексу, поскольку они упорядочены по другим индексам, а не в соответствии с их полем itemId.

Какой правильный запрос для выполнения обновления с учетом условия?

EDIT1
Я заменил свой filter на:

 final var filter = Filters.and(Filters.eq("accessDetail.email", email),
                Filters.elemMatch("listsOfItems",
                        Filters.eq("listId", listId)),
                Filters.elemMatch("listsOfItems.setOfItems",
                        Filters.eq("itemId", itemId)));

Теперь я получаю сообщение об ошибке: 'Невозможно создать поле' получено ' с правильным поддокументом, в который следует внести изменения.
Проблема сводится кupdateQuery.

...