如何解决Mongoose嵌套数组更新时的arrayFilters报错问题?
解决MongoDB嵌套数组更新的arrayFilters重复字段错误
问题描述
需要更新集合中嵌套数组steps.stepUsers的status属性,现有文档结构如下:
{ "_id" : ObjectId("63c7ca9584535c160ee4aaed"), "status" : "REJECTED", "steps" : [ { "_id" : ObjectId("63c7ca9884535c160ee4ab03"), "status" : "REJECTED", "stepUsers" : [ { "_id" : ObjectId("63c7ca9884535c160ee4ab04"), "status" : "REJECTED" } ] } ] }
尝试使用arrayFilters更新时抛出错误:
MongoServerError: Found multiple array filters with the same top-level field name steps
错误代码:
Collection.updateOne({ _id: id }, { $set: { "steps.$[steps].stepUsers.$[stepUsers].status": 'PENDING', } }, { arrayFilters: [ { "steps._id": step._id }, { "steps.stepUsers._id": stepUser._id } ] })
错误原因
arrayFilters中两个过滤器都使用了steps作为顶层字段名,MongoDB不允许重复的顶层标识符,每个数组过滤器必须设置唯一别名。
正确更新方法
给每个数组过滤器设置唯一别名,在$set的路径中对应使用这些别名:
Collection.updateOne({ _id: id }, { $set: { "steps.$[step].stepUsers.$[user].status": 'PENDING' } }, { arrayFilters: [ { "step._id": step._id }, { "user._id": stepUser._id } ] })
说明
- 第一个过滤器用
step作为别名,匹配steps数组中指定_id的元素 - 第二个过滤器用
user作为别名,匹配对应step下stepUsers数组中指定_id的元素 - 路径里的
$[step]和$[user]分别对应两个过滤器的别名,精准定位到需要更新的嵌套元素
内容的提问来源于stack exchange,提问作者Şahin Ersever
相关产品推荐
相关产品推荐

