MongoDB单更新查询实现子文档全字段置false后指定索引项设为true
MongoDB单条更新查询实现数组全量重置+指定位置字段修改
初始文档结构
[ { "_id": 1, "depots": [ { "_id": 1, "isFavourite": true }, { "_id": 2, "isFavourite": false }, { "_id": 3, "isFavourite": true }, { "_id": 4, "isFavourite": false } ] } ]
需求
编写一条单条更新查询(single update query),匹配_id: 1的文档,按顺序完成两个操作:
- 将
depots数组内所有子文档的isFavourite字段值统一设置为false - 将数组指定索引位置(示例为第二个子文档)的
isFavourite值设置为true
预期执行结果
更新完成后文档结构如下:
[ { "_id": 1, "depots": [ { "_id": 1, "isFavourite": false }, { "_id": 2, "isFavourite": true }, { "_id": 3, "isFavourite": false }, { "_id": 4, "isFavourite": false } ] } ]
原有写法问题
之前尝试的查询语句无法生效,核心原因有两点:
- 第一步直接写
"depots.isFavourite": false,在聚合更新管道中不会自动遍历数组修改每个子文档的字段,无法实现全量重置为false的效果 - MongoDB数组索引从0开始计数,第二个元素对应的索引是1,原写法中
depots.2指向的是第三个元素,索引值书写错误
正确实现语句
db.collection.update( { _id: 1 }, [ // 第一步:遍历depots数组,将所有子文档的isFavourite统一设为false { $set: { depots: { $map: { input: "$depots", in: { $mergeObjects: ["$$this", { isFavourite: false }] } } } } }, // 第二步:修改指定索引位置的子文档字段,索引从0开始计数,第二个元素对应索引1 { $set: { "depots.1.isFavourite": true } } ] )
扩展说明
如果需要设置其他位置的子文档为选中状态,只需要修改第二步中的索引值即可:
- 第一个元素对应索引:
0 - 第三个元素对应索引:
2 - 第N个元素对应索引:
N-1
内容的提问来源于stack exchange,提问作者Tobias S.
相关产品推荐
相关产品推荐

