MongoDB更新二级嵌套数组元素报错MongoError code 28如何解决?
问题原因
你遇到的MongoError错误码28为路径不匹配错误,核心原因是MongoDB的$占位符仅支持定位一级嵌套数组的匹配位置,你的数据结构是users集合下嵌套一级数组shops,shops下又嵌套二级数组products,直接使用shops.products.$无法准确定位到二级数组中的目标商品。
修改方案
你只需要调整DataService中的updateProductByProductId方法,使用arrayFilters配置项分别匹配两层嵌套数组的定位条件即可,修改后代码如下:
updateProductByProductId: function(productData, productID){ return new Promise((resolve, reject)=>{ const targetId = mongoose.Types.ObjectId(productID); User.updateOne( { "shops.products._id" : targetId }, { $set: { "shops.$[shopItem].products.$[productItem]": productData } }, { // 定义两层数组的过滤条件 arrayFilters: [ { "shopItem.products._id": targetId }, // 匹配包含目标商品的店铺 { "productItem._id": targetId } // 匹配店铺下的目标商品 ] } ).exec().then(()=>{ resolve(`product ${productID} successfully updated.`) }).catch(err=>{ reject(err); }); }); }
注意事项
- 如果你不需要全量覆盖商品数据,仅需要更新指定字段(比如仅修改商品标题),可以将
$set的配置调整为更精准的字段路径,避免丢失原有字段,示例如下:{ $set: { "shops.$[shopItem].products.$[productItem].title": productData.title } } - 请确保你使用的Mongoose版本支持
arrayFilters特性(v5.0以上版本均原生支持)。
内容的提问来源于stack exchange,提问作者Omid
相关产品推荐
相关产品推荐

