Mongoose Schema中Array内的重复值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongoose Schema中Array内的重复值相关的知识,希望对你有一定的参考价值。
我想要做的是我有一个带有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(这在前面的问题中没有涉及)
您的问题是在架构中teamList接收名称和dateAdded,您为每个更新执行默认值生成一个新的dateAdded:Date.now。
语句$ addToSet将检查整个数组对象是否重复。
{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);
});
以上是关于Mongoose Schema中Array内的重复值的主要内容,如果未能解决你的问题,请参考以下文章
如何实现 type:(new mongoose.Schema) as Array
Mongoose Schema 中的 JSON 中的 JS 数组
如何使用 Mongoose Schema 修复 GraphQL Mutation 中的构造函数错误 [重复]