如何通过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
相关产品推荐
相关产品推荐

