我有一个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",Filters.elemMatch("listsofItems",Filters.eq("listId",listId)),Filters.elemMatch("listsofItems.setOfItems",Filters.eq("itemId",itemId)));
现在,我收到错误消息:“无法创建字段'获得” 以及应该对其进行更改的正确子文档。
问题归结为updateQuery
。