使用猫鼬的重复项目

时间:2016-09-08 12:56:15

标签: node.js mongodb mongoose

我尝试使用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,因此我不知道这是我的错还是某些内容无效。

1 个答案:

答案 0 :(得分:2)

数组运算符 $addToSet 足以完成任务。除非值已存在,否则它会向数组添加值,在这种情况下, $addToSet 对该数组不执行任何操作。

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