gpt4 book ai didi

node.js - 使用 Mongoose 重复​​项目

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:58 25 4
gpt4 key购买 nike

我正在尝试使用 Node 和 Mongoose 从数据库中的列表插入元素。该列表仅包含字符串形式的 url。在插入之前,检查该 url 是否已存在于用户的数据库中。 “person”是一个文档,links 是一个数组:

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);
});
}
}

但它会生成重复的元素,我不明白为什么:

"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 会重复,所以我不知道这是我的错还是某些东西无法正常工作。

最佳答案

数组运算符 $addToSet 足够胜任这项任务。它将向数组添加一个值,除非该值已经存在,在这种情况下 $addToSet 对该数组没有任何作用。

您需要做的唯一任务是将 url 数组预处理为文档数组,类似于 Person 中的 links 嵌入架构。使用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);

关于node.js - 使用 Mongoose 重复​​项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39391571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com