如何在MongoDB中更新嵌套数组并修改subsubcategory的名称
MongoDB修改两层嵌套数组中subsubcategory的name字段方法
推荐方案(精准匹配,不受数组顺序影响)
适用于MongoDB 3.6及以上版本,通过数组过滤器定位到目标三级分类,无需关注各层级数组的下标位置,示例如下:
// 示例需求:将_id为301的三级分类name修改为"新三级分类名称" db.yourCollectionName.updateOne( // 第一层匹配:先定位到顶层分类文档,可根据需求调整缩小匹配范围 { "_id": "101" }, { $set: { // 使用占位符对应下方数组过滤器的匹配规则 "subcategory.$[subFilter].subsubcategory.$[subsubFilter].name": "新三级分类名称" } }, { arrayFilters: [ // 第二层过滤:匹配子分类的规则,不需要限制的话可直接写{} { "subFilter._id": "202" }, // 第三层过滤:精准匹配要修改的三级分类 { "subsubFilter._id": "301" } ] } )
临时替代方案(已知固定下标时使用)
如果你明确知道各层级数组的固定下标(从0开始计数),可以直接通过下标定位更新,不推荐长期使用,数组元素顺序变化会导致更新错位:
// 示例需求:修改subcategory数组第2个元素下的subsubcategory数组第1个元素的name db.yourCollectionName.updateOne( { "_id": "101" }, { $set: { "subcategory.1.subsubcategory.0.name": "新三级分类名称" } } )
注意事项
- 如果需要批量修改多个符合条件的三级分类,将
updateOne替换为updateMany即可 - 数组过滤器的规则可以自定义,比如要修改所有name为
subsubcategory_1的三级分类,直接把第三层过滤条件改为{ "subsubFilter.name": "subsubcategory_1" }即可 - 如果你的文档_id存储的是ObjectId类型,匹配时需要用
ObjectId("对应id值")包裹,不要直接写字符串
内容的提问来源于stack exchange,提问作者Nur Alam
相关产品推荐
相关产品推荐

