使用Node.js更新MongoDB中匹配accessid和name的嵌套数组元素状态
MongoDB两层嵌套数组指定元素更新方案
错误原因
- 原查询路径错误:
accessid字段属于levelone数组的直接子元素,不是levelone.level的子字段,原查询条件的字段匹配路径有误 - 普通
$定位符仅能匹配外层数组的第一个符合条件的元素,无法定位到内层level数组中对应name的元素,因此会出现更新错误的情况
正确实现方案
使用MongoDB 3.6及以上版本支持的arrayFilters数组过滤器,同时定位外层levelone数组符合accessid的元素、内层level数组符合name的元素,代码如下:
// 入参 const params = {"accessid" : "1627047023995", "name" : "Name 09", "status" : 100 }; collections.updateOne( // 匹配文档的基础条件 { "levelone.accessid": params.accessid, "levelone.level.name": params.name }, // 使用带标识符的$[]操作符指定更新路径 { $set: { "levelone.$[outerItem].level.$[innerItem].status": params.status } }, // 定义数组过滤器,分别匹配内外层数组的筛选条件 { arrayFilters: [ { "outerItem.accessid": params.accessid }, { "innerItem.name": params.name } ] } ).exec();
注意:你示例文档中
accessid存储为字符串类型,入参的accessid为数字类型,使用时建议统一类型避免匹配失败。
逻辑说明
$[outerItem]是外层数组levelone的占位符,通过arrayFilters里的outerItem.accessid条件筛选出外层数组中accessid匹配的元素$[innerItem]是内层level数组的占位符,通过arrayFilters里的innerItem.name条件筛选出内层数组中name匹配的元素- 该写法会精准定位到同时符合两个筛选条件的嵌套元素,不会误更新其他位置的元素
内容的提问来源于stack exchange,提问作者user15111949
相关产品推荐
相关产品推荐

