node.js - 如何在推送到数组之前检查子文档是否存在

标签 node.js express mongoose

我尝试过搜索,但发现不符合我的查询, 我有一个像这样的 JSON 输出,存在于数据库中

{ _id: 59c255f1f3e91433b4d4b58e,
  name: 'example name';,
  __v: 52,
  contacts: 
   [ { contactId: '59c255f1f3e91433b4d4b58e', //duplicated
        _id: 59c2a9f0471ffb202c3771d2,
       added: 2017-09-20T17:48:32.328Z },
      { contactId: '59c255f1f3e91433b4d4b58e', //duplicated
       _id: 59c2ac524fc91235a0d89195,
       added: 2017-09-20T17:58:42.956Z }
      { contactId: '59c255f1f3e91433b4234eff',
       _id: 59c2ac524fc91235a0d89195,
       added: 2017-09-20T17:58:42.956Z }
       ],
}

在尝试推送另一个 contactId 之前,如何检查所有 contacts.contactId 是否存在于此 contactId“59c255f1f3e91433b4d4b58e”, 它不断附加到数组,我需要确保只有一个带有“59c255f1f3e91433b4d4b58e”的 contactId 被推送到联系人数组,无论如何。

我不知道如何做到这一点,我已经尝试过:

User.findOne({_id: req.user.id}, function(err, newadd) { 
if(!newadd === req.req.params.to){ // also tried "indexOf" ^^ "lastIndexOf"
newadd.contacts.push({
    contactId:req.params.to
    })
newadd.save()
}else{
res.end('already exist try again')
}
  })

(我正在使用 Mongoose ) 我将非常感谢任何帮助:(

最佳答案

您可以使用 $addToSet 这将不允许结果数组中出现重复项 欲了解更多信息结帐$addToSet

以上内容适用于 Mongoose 并回答您的问题

 User.findOne({_id: req.user.id}, function(err, newadd) { 
     if(!newadd._id === req.params.to){
         newadd.contacts.push({
             contactId:req.params.to
         })
         newadd.save()
     }else{
         res.end('already exist try again')
     }
  })

关于node.js - 如何在推送到数组之前检查子文档是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46332414/

相关文章:

javascript - 从服务器(API?)获取数据并将其显示在 HTML 页面上

Node.js : EBADF, 错误的文件描述符

javascript - 使用带有数字问题的正则表达式拆分字符串

javascript - Node.js POST 导致 [错误 : socket hang up] code: 'ECONNRESET'

javascript - 无法使用 Express 应用程序中的 xmlreader 解析 Parse Cloud 中 xml 文件中的数据

javascript - 未找到公共(public)目录 (404) ExpressJS 和 Jade

javascript - 使用 Mongoose 中间件改变请求正文

node.js - ClientSession 无法序列化为 BSON

node.js - 在 NodeJS 0.10.8 中安装 Mongoose

node.js - 使用 typescript 和 mongoose 的静态方法确实是 : "An interface may only extend a class or another interface."