2016-07-21 8 views
1

Ich verwende MongoDB in meinem Sails-Setup, um meine Sammlungen zu speichern.Sails.js + Mongodb Einfügen eines verschachtelten Json-Datensatzes mit ORM

Ich mache eine POST-Anforderung über eine API, deren Antrag Körper sieht wie folgt aus:

       **THE REQUEST BODY** 
{ 
    "name":"Martin", 
    "phone":"5447874787", 
    "comment":"This is a comment", 
    "campaign":{ 
     "campaign_id":123454587, 
     "name":"Digital Marketing", 
     "category":"Marketing", 
     "sub_category":"Digital", 
     "product_name":"no product", 
     "product_id":5417 
    } 
} 

Dieser Datensatz ist in meiner Sammlung mongodb genannt werden gespeichert „führt“. Mein "Leads" Modell wie folgt aussieht:

module.exports = { 
    schema: true, 
    attributes:{ 
     name:{ 
      required:true, 
      type:"string", 
      unique: true 
     }, 
     phone:{ 
      type:"string" 
     }, 
     comment:{ 
      type:"string" 
     }, 
     campaign:{ 
      model: 'lead_campaign_detail', 
      // via: "lead_model" 
     } 
    } 
}; 

Die zugehörige "Lead_campaign_detail" Modell ist wie folgt

module.exports = { 
    attributes:{ 
     campaign_id:{ 
      required:true, 
      type:'integer' 
     }, 
     name:{ 
      type:"string" 
     }, 
     category:{ 
      type:"string" 
     }, 
     sub_category:{ 
      type:"string" 
     }, 
     product_name:{ 
      type:"string" 
     }, 
     product_id:{ 
      type:"integer" 
     } 
    } 
}; 

und mein Controller-Handler ist:

create_lead_api:function(req, res){ 
     Leads.create(params, function(err, resp){ 
      if(err) return res.negotiate(err); 
      else return res.json(resp); 
     }) 

    }, 

WAS ICH VERSUCHT HABE

1> Ich versuchte .native() verwenden. Es erstellt einen neuen Datensatz, aber es kümmert sich nicht um die Attribute im Modell "Leads" oder den anderen. Es speichert nur, wie die Anfrage ist.

2> Versuchte Erstellen der .create() verwenden. Es ist nicht speichert die verschachtelten Werte des Index "Kampagne" in der Anfrage:

{      **IN MY DB it looks like** 
    "name": "martin", 
    "phone": "5447874787", 
    "comment": "This is a comment", 
    "campaign": "579083f049cb6ad522a6dd3c", 
    "id": "579083f049cb6ad522a6dd3d" 
} 

ICH

1> Shop

WILL: der gespeicherte Wert wie folgt aussieht der Datensatz im selben Format wie der Wunsch gesendet wird.

2> Nutzen Sie die Wasserlinie ORM-Funktion .create() Gleiches gilt, wenn möglich zu erreichen.

3>.native() ist auch in Option, wenn meine Modell-Attribute: {} verwendet werden können, bringen dazwischen, bevor der Datensatz gespeichert werden. Ich möchte nur Werte speichern, die in Attributen definiert sind: {}

Jede Hilfe wird geschätzt, Google versagt mich. Dank

+0

Wie soll Ihr finales Dokument in der Leads-Sammlung aussehen? – rGun

+0

Im gleichen Format der Anforderungskörper (verschachtelt): { "name": "Martin", "Telefon": "5447874787", "comment": "Dies ist ein Kommentar", „Kampagne ": { "campaign_id": 123454587, "name":" Digital Marketing " "Kategorie": "Marketing", "sub_category": "Digital", "product_name": "keine", " product_id ": 5417 } } –

Antwort

1

Wenn Sie das Dokument in ‚Leads‘ Sammlung wollen, wie Ihre Anfrage Körper suchen, dann sollten Sie verwenden:

campaign: { 
    type: "json" 
} 

in Ihrem ‚Leads‘ -Modell, anstatt die Verknüpfung zu "lead_campaign_detail Sammlung . Sie können dann das lead_campaign_detail-Modell abschaffen.

Mit der Aussage model: 'lead_campaign_detail' verknüpfen Sie im Wesentlichen das Dokument "Leads" mit "lead_campaign_detail", siehe Waterline One-way association und populate() für weitere Details.

+0

[upvoted] Hey Entschuldigung für die späte Antwort und danke für die Antwort aber, was ist, wenn ich Validierung eines verschachtelten Elements hinzufügen möchte? Sagen Sie aus dem oben angegebenen Beispiel, das in der Frage angegeben ist: Ich möchte die Validierung zu "product_name" des Modells hinzufügen - "Lead_campaign_detail"? –

+0

Und es hat mein Problem nicht gelöst. Das Dokument wird immer noch bevölkert, ohne in meinen Segeln eingetragen zu werden - Modell –

+0

@SiddharthaChowdhury AFAIK-Segel erlauben nicht die Validierung von Feldern in Filialdokumenten. Sie können eine unidirektionale Zuordnung und populate() (Links in Antwort) verwenden, um ein solches Verhalten zu erreichen. Ihr Mongo-Dokument enthält jedoch nicht das vollständige Lead_campaign_detail, sondern nur die _id des Lead_campaign_detail-Dokuments. – rGun