You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过call._id获取MongoDB嵌套数组索引并更新数据

MongoDB嵌套数组更新问题解决

报错原因分析

你遇到的BSON field 'update.updates.arrayFilters.0' is the wrong type 'string', expected type 'object'错误,直接原因是arrayFilters语法错误:你用了逗号,而非冒号:定义键值对,导致该元素变成字符串集合而非合法BSON对象。

除此之外,update语句里的数组占位符使用也不符合MongoDB规则——不能直接用字段路径作为占位符,需要自定义变量名关联arrayFilters的匹配条件。

修正后的完整代码

use mydb

var lineNum = 0;
var callId = ObjectId("MY ID HERE");

// 精准匹配指定items索引下的目标call
var query = {
    [`items.${lineNum}.calls._id`]: callId
};

var update = {
    "$set": {
        // 原有正常逻辑保留
        [`items.${lineNum}.updatedTs`]: new Date(),
        // 用自定义占位符$[call]关联arrayFilters规则
        [`items.${lineNum}.calls.$[call].message.takenBy.firstName`]: "Dani"
    }
};

var options = {
    multi: true, 
    arrayFilters: [
        // 修正语法,用冒号定义键值对,变量名call对应update里的$[call]
        { "call._id": callId }
    ]
};

db.getCollection("myCollection").update(query, update, options);

关键改动说明

  • arrayFilters语法修复:将{"items.calls._id", callId}改为{ "call._id": callId },用冒号正确定义对象键值对,同时用call作为变量名。
  • 占位符关联匹配:update语句中的$[call]与arrayFilters里的call变量一一对应,MongoDB会自动定位items[lineNum].calls数组中_id等于callId的元素进行更新。
  • 查询条件优化:原查询"items.calls._id":callId会匹配所有包含该callId的文档(无论call在哪个items元素中),修正后的查询仅匹配指定lineNum的items下的目标call,更精准。

内容的提问来源于stack exchange,提问作者Daniella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:16