我要做什么 我有一个文档,其中含有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(在前面的问题中未涉及)
答案 0 :(得分:1)
您的问题是,在teamList架构中收到一个名称和一个 dateAdded ,您正在为每个更新执行生成一个新的dateAdd 默认值:Date.now 。 / p>
语句 $ 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);
});