У меня есть 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
.