You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MongoDB $push无法将产品添加至用户products数组问题咨询

问题:添加产品时无法通过$push将产品存入用户的products数组

我需要在添加产品的同时,把该产品存入对应客户账户的products数组,用客户邮箱作为标识。接口返回成功,但MongoDB的$push操作没有生效。

请求代码

export const addProduct = async (req, res, next)=> {
  try {
    const newProduct = new Product({
    userEmail: req.body.email,
    ...req.body,
  });
    const savedProduct = await newProduct.save();
    await User.findOneAndUpdate({email: req.body.email}, { $push: { products: newProduct }})
    res.status(201).json(savedProduct);
  } catch (err) {
    console.log(err)
    next(err);
  }
}

User Schema

import mongoose from 'mongoose';
const {Schema} = mongoose

const UserSchema = new Schema({
    email: {
        type: String,
        required: true,
        unique: true,
    },
    password: {
        type: String,
        required: true,
        min: 6,
    },
    fName: {
        type: String,
        required: false,
    },
    lName: {
        type: String,
        required: false,
    },
    address: {
        type: String,
        required: false,
    },
    postcode: {
        type: String,
        required: false,
    },
    phone: {
        type: String,
        required: false,
    },
    accountNumber: {
        type: String,
        required: false,
    },
    sortCode: {
        type: String,
        required: false,
    },
    products: {
        type:[],
        required: false,
    }
}, { timestamps: true })

export default mongoose.model("User", UserSchema)

排查与解决步骤

1. 使用已保存的产品文档而非未同步的实例

你在findOneAndUpdate中传入的是未完全同步数据库的newProduct实例,即便执行了save(),此时实例的状态可能未完全更新,应该用保存后的savedProduct:

// 修正update代码
await User.findOneAndUpdate(
  {email: req.body.email}, 
  { $push: { products: savedProduct } }
)

如果后续需要关联查询,更规范的做法是只存储产品的_id:

await User.findOneAndUpdate(
  {email: req.body.email}, 
  { $push: { products: savedProduct._id } }
)

2. 修正User Schema中products字段的类型定义

当前products字段用type: []属于混合类型,可能导致存储异常,建议明确类型:

  • 若存储完整产品文档,定义为混合类型数组:
products: {
    type: [mongoose.Schema.Types.Mixed],
    required: false,
}
  • 若存储产品ID引用(推荐),先导入Product模型,再定义:
import Product from './Product.js'; // 导入对应路径的Product模型
// ...
products: {
    type: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Product' }],
    required: false,
}

3. 验证查询条件是否匹配目标用户

确认req.body.email对应的用户存在,可在update前添加验证:

const targetUser = await User.findOne({email: req.body.email});
if (!targetUser) {
  return res.status(404).json({message: '目标用户不存在'});
}

4. 开启Mongoose调试模式查看原生命令

开启调试能直观看到执行的MongoDB命令,排查参数是否正确:

mongoose.set('debug', true);

控制台会打印所有数据库操作,可检查$push的参数和查询条件是否符合预期。

5. 完善异步操作的错误捕获

为findOneAndUpdate添加错误捕获,确保更新失败时能及时发现问题:

try {
  // ... 其他代码
  const updateResult = await User.findOneAndUpdate(
    {email: req.body.email}, 
    { $push: { products: savedProduct._id } },
    { new: true } // 返回更新后的用户文档,方便验证结果
  );
  console.log('用户更新结果:', updateResult);
} catch (err) {
  console.error('更新用户产品列表失败:', err);
  next(err);
}

内容的提问来源于stack exchange,提问作者bootygrocery1000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:55:00