Mongoose教程:如何更新对象数组中指定子文档的字段值
如何更新MongoDB数组中符合条件的子文档字段
集合示例数据
[ { "_id": ObjectId("649d1b0b5e40905678a30829"), "slug": "samsung-s22", "name": "Samsung S22", "params": [ { "modelno": "SM-S901B", "color": "White", "price": "64000", "_id": ObjectId("649e70bdd20e94bef90f2e7f") }, { "modelno": "SM-S901B", "color": "Black", "price": "64000", "_id": ObjectId("649e70bdd20e94bef90f2e7d") }, { "modelno": "SM-S901U", "color": "Black", "price": "74000", "_id": ObjectId("649e70bdd20e94bef90f2a7f") }, { "modelno": "SM-S901U", "color": "Black", "price": "74000", "_id": ObjectId("649e70bdd20e94bef90f2b7f") } ] }, { "_id": ObjectId("649d1b0b5e40905678a30819"), "slug": "vivo-v19", "name": "Vivo V19", "params": [ { "modelno": "Vivo 1933", "color": "Grey", "price": "34000", "_id": ObjectId("659e70bdd20e94bef90f2e7f") }, { "modelno": "Vivo 1933", "color": "Black", "price": "34000", "_id": ObjectId("659e70bdd20e94bef90f2e7d") }, { "modelno": "Vivo 2933", "color": "Black", "price": "44000", "_id": ObjectId("659e70bdd20e94bef90f2a7f") } ] } ]
需求说明
需要更新指定条件下数组子文档的price字段:当文档name为"Samsung S22",且子文档modelno为"SM-S901B"时,将这些子文档的price值改为"69999",仅更新匹配的子文档,其他子文档不受影响。
解决方案
使用MongoDB的updateMany结合过滤位置操作符实现批量更新,命令如下:
db.collection.updateMany( // 查询条件:匹配name为Samsung S22且包含指定modelno的文档 { "name": "Samsung S22", "params.modelno": "SM-S901B" }, // 更新操作:设置匹配子文档的price字段 { "$set": { "params.$[elem].price": "69999" } }, // 数组过滤规则:仅匹配modelno为SM-S901B的子文档 { "arrayFilters": [ { "elem.modelno": "SM-S901B" } ] } )
命令说明
- 查询条件:先定位到
name为"Samsung S22"的主文档,同时确保该文档的params数组中存在modelno为"SM-S901B"的子文档; - 更新操作:通过
$[elem]占位符指定要更新的数组元素,elem对应arrayFilters中定义的过滤规则; - 数组过滤:
arrayFilters定义了子文档的匹配条件,只有符合modelno: "SM-S901B"的子文档才会被更新。
执行该命令后,符合条件的两个子文档price会被修改为"69999",其他子文档保持不变。
内容的提问来源于stack exchange,提问作者Ajith
相关产品推荐
相关产品推荐

