Mongoose向嵌套数组添加数据时报错:Cannot create field 'id' in element {buffHave: []}
Mongoose向嵌套数组添加数据时报错:Cannot create field 'id' in element {buffHave: []}
嘿,我来帮你搞定这个报错问题!
首先得搞清楚报错的根源:你的Schema里buffHave是一个对象数组,每个元素都包含id(数组类型)和duration(日期类型)两个字段。但你现在的updateOne写法是直接对buffHave.id和buffHave.duration执行$push,这相当于试图给buffHave数组里的每一个元素添加这两个字段——可问题是,当buffHave是空数组的时候,根本没有元素可以用来创建这些字段,所以MongoDB就抛出了这个错误。
接下来根据你的实际需求,给你两种解决方案:
情况1:往buffHave数组里新增一个完整的buff对象
如果你的需求是添加一条包含id数组和duration的完整记录到buffHave里,那应该直接把整个对象push到buffHave数组中,代码修改如下:
await userData.updateOne( { userId: user.id }, { $push: { buffHave: { id: [buffId], // 注意id是数组类型,所以要传数组格式的值 duration: buffs[buffId].duration } } } );
情况2:给buffHave数组中已存在的对象的id数组添加新元素
如果你的需求是给buffHave里某个已有的对象的id数组追加新的buffId,那需要用**数组过滤器(arrayFilters)**来定位到目标对象,再更新其内部的id字段,示例代码如下:
await userData.updateOne( { userId: user.id }, { $push: { "buffHave.$[elem].id": buffId } }, { // 这里的过滤器用来匹配你要更新的那个buffHave元素,可根据实际条件调整,比如按duration筛选 arrayFilters: [{ "elem.duration": { $exists: true } }] } );
简单总结一下:操作嵌套数组的时候,要区分是往外层数组加对象,还是修改内层对象的字段——前者直接push整个对象到外层数组,后者需要用数组过滤器定位到目标元素再操作。
备注:内容来源于stack exchange,提问作者MZAJ
相关产品推荐
相关产品推荐

