【问题标题】:Duplicate values inside Array in Mongoose SchemaMongoose Schema中数组内的重复值
【发布时间】:2018-07-13 02:20:35
【问题描述】:

我想做的事 我有一个带有 teamid 作为团队唯一标识符和名称的文档。我的模型中有一个数组“teamList”,其中包含所有团队成员的姓名。添加新成员时,我只想添加不存在的名称。因此,如果名称已经存在,则不应添加。

问题 我想确保在 teamList 数组中没有重复。但是现在,names 数组中的所有对象都添加到了 teamList,尽管使用了 $addToSet 并关闭了数组中的 _id。

这是我的架构:

var teamSchema = new Schema({
  teamid: {
    type: String,
    required: true
  },
  created: {
    type: Date
  },
  lastUpdated: {
    type: Date,
    default: Date.now,
    required: true
  },
  teamList: [{
    name: {
      type: String,
      required: true,
      unique: true
    },
    dateAdded: {
      type: Date,
      default: Date.now
    },
    _id:false
  }]
});
module.exports = mongoose.model('teamModel', teamSchema);

这是我的代码:

var mongoose = require('mongoose');
teamModel = mongoose.model('teamModel');
var names = [{name:'Robert'},{name:'Alice'},{name:'Bob'}];
var teamName = 'ManU';
teamModel.update({
        teamid: teamName
      }, {
        $addToSet: {
          teamList: {
            $each: names
          }
        }
      }, {
        upsert: true
      },
      function (err, data) {
       console.log(data);
      });

我的问题类似于 - http://blog.open-tribute.org/2015/05/09/NodeJS-Mongoose-addToSet-duplicates-on-objects/ , Avoid duplicate entries on Mongoose array

但是 $addToSet 对我不起作用,可能是因为我传入了一个要添加到 teamList 数组的数组,所以我必须使用 $each(前面的问题中没有涉及)

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您的问题是,在架构中,teamList 收到一个名称和一个 dateAdded,您正在为每个更新执行生成一个新的 dateAdded默认值:Date.now

    语句$addToSet会检查整个数组对象是否重复。

    {名称 : “罗伯特” 添加日期 : 2018-07-14 14:06:09.749}

    不同于:

    {名称 : “罗伯特” 添加日期 : 2018-07-14 14:06:12.473}

    如果您需要存储新成员添加的日期,您需要在更新前检查它。

    一种可能的解决方案:

    var teamPeople = [{name:'Robert'},{name:'Alice'},{name:'Bob'},,{name:'Ane'}];
      var teamName = 'ManU';
      var currentTeam = await TeamModel.findOne({teamid: teamName},{"teamList":1});
      for(var i=0;i < teamPeople.length;i++) {
        for (var j = 0; j < currentTeam.teamList.length; j++) {
          if (currentTeam.teamList[j].name === teamPeople[i].name) {
            //remove duplicate team member
            teamPeople.splice(teamPeople[j], 1);
          }
        }
      }
      console.log('New names:'+teamPeople);
    
      TeamModel.update({
          teamid: teamName
        }, {
          $addToSet: {
            teamList: {
              $each: teamPeople
            }
          }
        }, {
          upsert: true
        },
        function (err, data) {
          console.log(data);
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-17
      • 2014-05-26
      • 2021-04-29
      • 2015-11-26
      • 2017-12-13
      • 2021-04-08
      • 2018-04-16
      • 2015-02-06
      相关资源
      最近更新 更多