我尝试使用node和mongoose从数据库中的列表中插入元素。该列表仅包含url作为字符串。在插入之前,检查URL是否已存在于用户的数据库中。 "人"是一个文档,链接是一个数组:
str_ = std::move(str);
但它产生了重复的元素,我不明白为什么:
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);
});
}
}
此外,对于同一个网址重复_id,因此我不知道这是我的错还是某些内容无效。
答案 0 :(得分:2)
数组运算符 $addToSet
足以完成任务。除非值已存在,否则它会向数组添加值,在这种情况下, $addToSet
对该数组不执行任何操作。
您唯一需要做的就是将url
数组预处理为类似于links
中Person
嵌入式架构的文档数组。使用 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);