代码之家  ›  专栏  ›  技术社区  ›  Sashi

Mongoose架构中数组内的重复值

  •  1
  • Sashi  · 技术社区  · 6 年前

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

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

    这是我的方案:

    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(这在前面的问题中没有介绍)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marcus Vinicius Sousa Vieira    6 年前

    您的问题是,在模式中,工作组列表接收名称和 添加日期 ,您将为每次执行更新生成一个新的添加日期。 默认值:日期。 .

    声明 $添加到集 将检查 整个数组对象 是否重复。

    enter image description here

    {名称 : “罗伯特” 添加日期 : 2018年7月14日14:06:09.749_

    不同于:

    {名称 : “罗伯特” 添加日期 : 2018年7月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);
        });