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

Mongoose中如何避免向用户Features数组添加重复ID

问题描述

我有两个MongoDB集合,User集合的features字段是引用Features集合ID的ObjectId数组。两个集合的模型如下:

Features集合模型

var FeaturesSchema = new Schema({
  name : String,
  uniq_name : String,
  created_by:{
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  status:{
    type: Boolean,
    default: true
  },
  created_at:{
    type: Date,
    default: new Date()
  },
});

module.exports = mongoose.model('Features', FeaturesSchema);

User集合中对应的字段

features : [{
  type: Schema.Types.ObjectId,
  ref: 'Features'
}],

我通过Postman向API发送包含Feature ID数组的请求,为指定邮箱的用户添加Features。当前API使用$push操作更新,但会重复添加已存在的Feature ID,请问如何修改代码避免这个问题?

解决方案

要避免数组中重复添加元素,直接用MongoDB的$addToSet操作符替换$push即可,它只会往数组里添加不存在的元素。如果是批量添加多个ID,需要配合$each来遍历传入的数组。

修改后的代码示例

假设原更新逻辑是这样的:

User.updateOne(
  { email: req.body.email },
  { $push: { features: { $each: req.body.featureIds } } },
  (err, result) => {
    // 原有处理逻辑
  }
);

把$push换成$addToSet就解决问题了:

User.updateOne(
  { email: req.body.email },
  { $addToSet: { features: { $each: req.body.featureIds } } },
  (err, result) => {
    if (err) {
      return res.status(500).json({ error: err.message });
    }
    res.status(200).json({ message: "Features添加成功", result });
  }
);

关键说明

  • $addToSet:会先检查目标数组,只有元素不存在时才添加,完全避免重复
  • $each:用来配合$addToSet实现批量添加,把传入的ID数组逐个处理

这样修改后,不管请求里有没有重复的Feature ID,最终用户的features数组里都不会出现重复项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:54:23