希望在Sequelize / Postgres数据库查询中迭代JSON以查找匹配值

时间:2017-07-06 22:06:14

标签: javascript json node.js postgresql sequelize.js

这是我在这里发表的第一篇文章,所以请保持温柔。 我在Node中使用Sequelize w / PostgresDB并尝试使用findOrCreate通过电子邮件搜索联系人。电子邮件条目采用JSON格式(请参阅下面的结构)......

我希望通过电子邮件找到联系人,并针对每个联系人条目迭代JSON数组中的每个电子邮件地址。

我在POST有效负载中传递了一个电子邮件地址和一个名字。

如果我无法通过电子邮件找到联系人,我想创建一个新联系人(这部分很简单)。

router.post('/gmail/fetchcontact', function (req, res, next){

    Contacts.findOrCreate({
        where: {
          email:  // this is where I am stuck. How do I access this array and loop over?          
        },
        defaults: {
          name: req.body.name // 
        }
      })
      .then(response => {
        if (response[1] === true) {
          console.log('RESPONSE!!!', response[1])
        }

      })

//这是JSON的结构,我正在寻找ITERATE

[{
          address: 'your.name@gmail.com',
          primary: true,
          rel: 'http://schemas.google.com/g/2005#home'
        },{
          address: 'work@work.com',
          primary: false,
          labels: ['work'],
        },{
          address: 'play@play.com',
          primary: false,
          labels: ['play'],
        }]

有什么想法吗?任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

我会创建一个只包含电子邮件的数组,然后进行$in搜索。

const emails = [{
      address: 'your.name@gmail.com',
      primary: true,
      rel: 'http://schemas.google.com/g/2005#home'
    },{
      address: 'work@work.com',
      primary: false,
      labels: ['work'],
    },{
      address: 'play@play.com',
      primary: false,
      labels: ['play'],
    }].map(email => email.address);

搜索:

Contacts.findOrCreate({
    where: {
      email: { $in: emails }
    },
    defaults: {
      name: req.body.name // 
    }
  })
  .then(response => {
    if (response[1] === true) {
      console.log('RESPONSE!!!', response[1])
    }
  });

$in上的文档位于:http://docs.sequelizejs.com/manual/tutorial/models-usage.html#-findall-search-for-multiple-elements-in-the-database

答案 1 :(得分:0)

我为此找到了一个很好的解决方案......

首先,您必须更改数据值以键入:Sequelize.JSONB

然后你可以迭代嵌套的JSON对象和数组,如下所示:

 Contacts.findOne({
    where: {
      email: {
        $contains: [{
          address: req.body.email
        }]
      },
      UserId: req.user.id
    }
  })

**请注意,在$ contains中,我将对象包装在一个数组中