2017-07-06 1 views
0

Dies ist mein erster Beitrag hier, also bitte sei sanft. Ich benutze Sequelize w/PostgresDB in Node und versuche, per findOrCreate nach einem Kontakt per E-Mail zu suchen. Der E-Mail-Eintrag ist im JSON-Format (siehe folgende Struktur) ...Suchen, um über JSON in einer Sequelize/Postgres DB-Abfrage zu iterieren, um einen übereinstimmenden Wert zu finden

Ich möchte einen Kontakt per E-Mail finden und über jede E-Mail-Adresse im JSON-Array für jeden Kontakteintrag iterieren.

Ich gebe eine E-Mail-Adresse und einen Namen in der POST-Nutzlast.

Wenn ich den Kontakt nicht per E-Mail finden kann, möchte ich einen neuen Kontakt erstellen (dieser Teil ist einfach).

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

     }) 

// Das ist die Struktur der JSON ICH SUCHE ÜBER iterieren

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

Irgendwelche Ideen? Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Antwort

0

Ich würde ein Array nur der E-Mails erstellen und dann eine $in Suche durchführen.

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

Suche:

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

Dokumentation auf $in hier: http://docs.sequelizejs.com/manual/tutorial/models-usage.html#-findall-search-for-multiple-elements-in-the-database

+0

Sie für die Antwort vielen Dank. Schätze es., Probiere den Code aus und kreise zurück, wenn es funktioniert ... –

0

ich eine großartige Lösung für dieses ...

Zuerst fanden müssen Sie den Datenwert ändern eingeben : Sequelize.JSONB

Dann können Sie iter verschachtelte JSON-Objekte und Arrays aß über etwa so:

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

** Bitte beachten Sie, dass in $ I enthält das Objekt in einem Array gewickelten

Verwandte Themen