Mongoose操作MongoDB时无法向文档内嵌数组添加对象,如何修复?
问题原因
Coin.find()方法返回的是符合查询条件的文档数组,不是单个文档对象,因此coin.orders为undefined,调用push方法触发报错。- 异步函数无等待逻辑,直接并行调用
createCoin和createOrder,可能出现coin还未创建完成就执行查询添加订单的逻辑,导致查询结果为空。 coin.save()未添加await关键字,可能出现修改未完成就结束执行的问题,同时缺少错误捕获逻辑。
修复方案
1. 调整addOrder函数
将Coin.find替换为Coin.findOne获取单个文档,补充await和错误捕获:
async function addOrder(coinName,order){ // 替换find为findOne获取单个文档 const coin = await Coin.findOne({name:coinName}); if(!coin) { console.log('未找到对应coin文档'); return; } coin.orders.push(order); // 保存加await await coin.save(); console.log("订单关联成功"); }
2. 调整异步执行顺序
确保coin创建完成后再执行订单创建逻辑,避免查询不到coin:
// 调整执行逻辑,先创建coin,成功后再创建订单 (async function init() { await createCoin(); await createOrder(); })()
可选优化:关联模式说明
你当前使用的是嵌套文档模式,也就是coin的orders数组会完整存储order的所有字段,如果你不需要单独维护Order集合,可以去掉Order模型的定义,直接在coin里嵌套orderSchema即可。如果需要两个独立集合通过引用关联,可以把coinSchema的orders字段改成存储ObjectId的形式:
// 引用关联模式的coinSchema写法 const coinSchema = new mongoose.Schema( { name: String, description: String, orders: [{type: mongoose.Schema.Types.ObjectId, ref: 'Order'}], } ); // 查询的时候可以用populate关联查询order的完整内容 const coin = await Coin.findOne({name:'BTT'}).populate('orders');
内容的提问来源于stack exchange,提问作者uday
相关产品推荐
相关产品推荐

