MongoDB数组元素存为整数而非实际值问题(Mongoose场景)
异常产生原因
核心问题是对JavaScript数组push方法的返回值存在认知错误:
Array.prototype.push()是原地修改方法,会直接改动调用它的原数组,返回值是操作完成后数组的新长度(数字类型),并非修改后的数组本身。- 你写的
friend[0].dms = new Array().push(newDmID)逻辑实际执行流程是:创建空数组 → 向空数组压入newDmID→ 返回压入后的数组长度1,最终赋值给dms字段的是数字1,不是包含群ID的数组。 - 实际存储为
[2]是两个因素共同导致的:- 你判断
dms数组是否存在的逻辑未生效,当用户文档已经存在长度为1的dms数组时,仍然执行了赋值操作:friend[0].dms = friend[0].dms.push(newDmID),此时原数组长度为1,push新元素后返回长度值2,你把数字2赋值给了本应为数组类型的dms字段。 - Mongoose做类型适配时,如果数组类型字段接收到非数组的单值,会自动将其包装为单元素数组存储,因此数字2最终被存成了
[2]。
- 你判断
修复方案
根据场景调整代码即可:
- 初始化场景(确认
dms字段不存在):不要用push返回值赋值,直接初始化包含目标ID的数组:friend[0].dms = [newDmID] - 追加场景(
dms数组已存在):直接在原数组上调用push即可,不要接收push返回值重新赋值:friend[0].dms.push(newDmID)
优化建议:在用户Schema中为dms字段设置空数组默认值,从根源避免字段不存在的判断分支,减少出错概率:
const userSchema = new mongoose.Schema({ // 其余业务字段... dms: { type: [String], default: [] } })
配置默认值后,所有用户文档创建时会自动初始化空的dms数组,后续追加群ID直接调用push方法即可,不需要额外写字段存在性判断。
内容的提问来源于stack exchange,提问作者Liam Sholts
相关产品推荐
相关产品推荐

