更新 mongodb 中数组数组内文档的字段
Update field of a document inside an array of arrays in mongodb
我有一个 Document
,它有一个名为 listsOfItems
的数组字段。它的内容是Documents
,它们都包含另一个名为setOfItems
的数组字段,它由Document
.
组成
所以结构就像 listsOfItems
(Documents
的数组) > setOfItems
(Documents
的数组) > Items
(Documents
)
listsOfItems
中的每个Document
都有一个listId
字段,用于唯一识别它的内容。
setOfItems
中的每个 Document
都有一个 itemId
字段,用于唯一标识其内容。
鉴于 listId
[,我想更改 setOfItems
的 Document
内字段的值=74=] 和 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)));
现在我收到错误消息:'无法使用应在其中进行更改的正确子文档创建字段 'obtained'。
问题归结为 updateQuery
。
为此,您需要使用 arrayFilters。
Document filter = new Document("base-doc-field","<value>");//query for base doc
//fields if any
Document updateDoc = new Document("$inc",
new Document("listOfItems.$[elem].setOfItems.$[elem1].fieldName","value to
update"));
//prepare array filters.
List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.listId","<list_id>"));
arrayFilters.add(new Document("elem1.itemId","<item_id>"));
//prepare update options, and set these array filters to update options.
UpdateOptions options = new UpdateOptions().
arrayFilters(filterArr).bypassDocumentValidation(true);
//execute update method.
collection.updateOne(filter,updateDoc,options);
我有一个 Document
,它有一个名为 listsOfItems
的数组字段。它的内容是Documents
,它们都包含另一个名为setOfItems
的数组字段,它由Document
.
组成
所以结构就像 listsOfItems
(Documents
的数组) > setOfItems
(Documents
的数组) > Items
(Documents
)
listsOfItems
中的每个Document
都有一个listId
字段,用于唯一识别它的内容。
setOfItems
中的每个 Document
都有一个 itemId
字段,用于唯一标识其内容。
鉴于 listId
[,我想更改 setOfItems
的 Document
内字段的值=74=] 和 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)));
现在我收到错误消息:'无法使用应在其中进行更改的正确子文档创建字段 'obtained'。
问题归结为 updateQuery
。
为此,您需要使用 arrayFilters。
Document filter = new Document("base-doc-field","<value>");//query for base doc
//fields if any
Document updateDoc = new Document("$inc",
new Document("listOfItems.$[elem].setOfItems.$[elem1].fieldName","value to
update"));
//prepare array filters.
List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.listId","<list_id>"));
arrayFilters.add(new Document("elem1.itemId","<item_id>"));
//prepare update options, and set these array filters to update options.
UpdateOptions options = new UpdateOptions().
arrayFilters(filterArr).bypassDocumentValidation(true);
//execute update method.
collection.updateOne(filter,updateDoc,options);