Mongoose Schema中Array内的重复值

问题描述 投票:1回答:1

我想要做的是我有一个带有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(这在前面的问题中没有涉及)

node.js mongodb mongoose
1个回答
1
投票

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

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

enter image description here

{name:“Robert”dateAdded:2018-07-14 14:06:09.749}

不同于:

{name:“Robert”dateAdded: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);
    });
© www.soinside.com 2019 - 2024. All rights reserved.