MongoDB/NodeJS中如何将购物车嵌套对象数组推送到订单?
问题场景
现有如下结构的Cart文档:
{ "_id" : ObjectId("cart123"), "userId" : "user123", "email" : "test@mail.com", "products" : [ { "productId" : "11111", "price" : 20, "quantity" : 1 }, { "productId" : "22222", "price" : 24, "quantity" : 1 } ] }
以及如下结构的Order文档:
{ "_id" : ObjectId("order123"), "userId" : "user123", "email" : "test@mail.com", "products" : [ ], "status" : "pending" }
尝试将Cart的products数组内容推送到Order的products数组中,原代码如下:
const userProduct = await Cart.find({ userId: userData.userId }).select({ 'products': 1,'_id': 0 }); const updatedOrder = await Order.findOneAndUpdate({ userId: userData.userId }, { $push: { "products": {$each: userProduct }}})
问题原因
Cart.find()会返回文档数组,哪怕只有一个匹配的购物车,userProduct的结构会是[{ products: [...] }],直接把这个数组传给$each,会导致Order的products数组中插入整个对象,而非期望的单个商品对象,产生嵌套错误。
正确实现代码
// 用findOne获取单个购物车文档,而非find返回数组 const cart = await Cart.findOne({ userId: userData.userId }).select('products -_id'); // 确认购物车存在且有商品数组 if (cart?.products) { // 使用$push + $each将购物车的商品逐个推送到订单的商品数组中 const updatedOrder = await Order.findOneAndUpdate( { userId: userData.userId }, { $push: { products: { $each: cart.products } } }, { new: true } // 此选项会返回更新后的订单文档,否则返回更新前的 ); }
额外说明
- 用
findOne替代find,确保获取单个购物车文档,直接提取其products数组。 - 添加
new: true选项可直接拿到更新后的订单数据,方便后续业务逻辑使用。 - 增加
cart?.products的空值判断,避免因购物车不存在或无商品引发的报错。
内容的提问来源于stack exchange,提问作者mikeRodz
相关产品推荐
相关产品推荐

