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

MongoDB API中$addToSet无法更新数组问题求助

问题:MongoDB $addToSet 更新数组返回成功但数据库无变化

我在开发名言生成器的分类系统时遇到问题:为名言分配分类时,调用接口返回更新成功,但数据库中Category集合的quoteId数组始终为空。

相关代码

Category模型

const mongoose = require('mongoose');

const categorySchema = mongoose.Schema({
  title: { type: String, required: true },
  quoteId: { type: Array, required: false },
  userId: { type: Array, required: false },
});

module.exports = mongoose.model('Category', categorySchema);

更新接口代码

exports.setCategoryProduct = (req, res) => {
  Category.updateOne(
    { title: req.params.categoryTitle },
    { $addToSet: { quoteId: req.body.quoteId } }
  )
    .then(() =>
      res.status(201).json({ message: 'Category updated !', status: 201 })
    )
    .catch((error) => res.status(500).json({ error: error, status: 500 }));
};

排查与解决步骤

  • 检查查询条件是否匹配文档
    MongoDB的updateOne方法即使没有找到匹配的文档,也会返回成功响应(此时result.nModified为0)。修改代码打印更新结果,确认是否命中目标文档:

    exports.setCategoryProduct = (req, res) => {
      Category.updateOne(
        { title: req.params.categoryTitle },
        { $addToSet: { quoteId: req.body.quoteId } }
      )
        .then(result => {
          console.log('Update result:', result);
          if (result.nModified === 0) {
            return res.status(404).json({ message: '未找到对应分类', status: 404 });
          }
          res.status(201).json({ message: 'Category updated !', status: 201 })
        })
        .catch((error) => res.status(500).json({ error: error, status: 500 }));
    };
    

    同时确认req.params.categoryTitle与数据库中分类的title完全一致(MongoDB查询大小写敏感,注意空格、大小写差异)。

  • 验证请求体参数是否正确传递
    在接口中打印req.body.quoteId,确认参数是否正常接收:

    console.log('Received quoteId:', req.body.quoteId);
    

    如果quoteId是MongoDB的ObjectId类型,需要先转换类型后再更新:

    const { Types } = require('mongoose');
    const targetQuoteId = Types.ObjectId(req.body.quoteId);
    
    Category.updateOne(
      { title: req.params.categoryTitle },
      { $addToSet: { quoteId: targetQuoteId } }
    )
    
  • 修正Schema类型定义
    若quoteId存储的是Quote文档的ObjectId引用,建议明确Schema类型,避免类型不匹配导致更新失效:

    quoteId: { type: [mongoose.Schema.Types.ObjectId], required: false, ref: 'Quote' },
    
  • 确认请求方法与路由匹配
    确保接口路由使用的是PUT方法,与POSTMAN发送的请求方法一致:

    // 示例路由定义
    router.put('/categories/:categoryTitle', setCategoryProduct);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:30:23