使用mongoose的重复的项目

我试图从列表中插入元素使用节点和mongoose在我的数据库。 该列表只包含url作为string。 在插入之前,检查URL是否已经在用户的数据库中。 “人”是一个文件,链接是一个数组:

for (var i = 0; i < url.length; i++) { var found = false; //if no links if (person.links.length === 0) { person.links.push({link: url[i]}); person.save(function (err) { if (err) return handleError(err); }); } else{ //for each link in database for (var z = 0; z < person.links.length; z++) { //If we find it change status if (url[i] === person.links[z].link) { found = true; break; } } //If we have not found it if (found === false) { //Save it person.links.push({link: url[i]}); person.save(function (err) { if (err) return handleError(err); }); } } 

但它会产生重复elemts,我不明白为什么:

 "links" : [ { "link" : "google.es", "_id" : ObjectId("57d15ed8b9859615ef11e8b6"), }, { "link" : "gog.com", "_id" : ObjectId("57d15ed8b9859615ef11e8b7"), }, { "link" : "google.es", "_id" : ObjectId("57d15ed8b9859615ef11e8b6"), }, { "link" : "gog.com", "_id" : ObjectId("57d15ed8b9859615ef11e8b7"), } ], 

此外,_id重复相同的url,所以我不知道这是我的错还是某些工作不正确。

数组运算符$addToSet足以胜任任务。 它为数组添加一个值,除非该值已经存在,在这种情况下$addToSet对该数组不做任何事情。

您唯一要做的就是将url数组预处理成一个类似于Personlinksembedded模式的文档。 使用map()来转换数组。

考虑以下操作,即使更高效地完成相同的操作:

 var links = url.map(function(u){ return { "link": u }; }); person.update( { "_id": personId }, { "$addToSet": { "links": { "$each": links } } }, function(err, result) { if (err) return handleError(err); console.log(result); } ); 

或者只使用Mongoose的addToSet()方法:

 var links = url.map(function(u){ return { "link": u }; }); console.log(person.links) // call the addToSet function using the array with apply() var added = person.links.addToSet.apply(this, links); console.log(person.links); console.log(added);