2017-01-25 2 views
1

Dies sollte einfach sein, aber es ist überraschend schwierig und extrem frustrierend. Ich versuche, ein "Object" -Feld in mongodb mit einem neuen Objekt zu überschreiben, das der Benutzer auf meiner Client-Webseite erstellt. Ich habe bestätigt, dass alle anderen Felder, die ich an die Update-Operation übergebe, tatsächlich aktualisiert werden, mit Ausnahme des Javascript-Objekts. Statt es mit dem Objekt zu aktualisieren Ich bin vorbei (Während ich validiert mit dem Objekt aufgefüllt wird, ich die durch bin), aktualisiert sie es einfach zurück zu {} anstelle von, was übergeben wird:Objekt in Mongodb überschreiben

{ nodes:[ { w: 120, h: 80,type: 'InHive',left: 184,top: 90,text: 'item',query: 'hey',name: 'sample',id: '7686132d-6fcf-4a3b-baa2-b1c628e0b2d6' } ], edges: [], ports: [],groups: [] } 

Wenn ich versuche, Um das Datenfeld außerhalb der Meteor-Methode direkt von der Mongo-Konsole zu aktualisieren, überschreibt es dieses Feld erfolgreich mit dem Javascript-Objekt. Was mache ich hier falsch, weil ich für das Leben von mir das nicht herausfinden kann?

Server Methode

'updateOneWorkflow': function(id, field, object) { 
    this.unblock; 
    if (Meteor.userId()) { 
     var _username = Meteor.user().username; 
     MYCOLLECTION.update({ 
      _id: id 
     }, { 
      $set: { 
       [field]: object, //this just gets reset back to {} whenever this update method is called 
       "metadata.last_modified_dt": new Date(), //this gets updated 
       "metadata.modified_by": Meteor.userId(), //this gets updated 
       'metadata.modified_by_username': _username //This gets updated 
      } 
     }); 
    } else { 
     throw new Meteor.Error(403, "You are not authorized to perform this function"); 
    } 
} 

Client-Call:

var _jsonformat = toolkit.exportData(); 
     var currentid = Session.get('rulesRowClicked')._id; 
     console.log(_jsonformat); 
     Meteor.call('updateOneWorkflow' , currentid, 'data', _jsonformat, function(err, res){ 
      if(err){ 
       toastr.error('Failed to save result ' + err); 
      } 
      else{ 
       toastr.success('Saved workflow'); 
      } 
     }); 
+0

Was sind die Werte/Typen von 'Feld' und 'Objekt' vor der Update-Anweisung? Können Sie uns zeigen, was Sie bekommen, wenn Sie console.log (field)/console.log (object) ausführen? –

+0

Wenn Sie sich den Client-Code ansehen, wird angezeigt, was an die obige Methode übergeben wird. Feld ist 'Daten' und das Konsolenprotokoll auf dem Server und dem Client zeigen das JSON-Objekt, das zusammen mit dem Feldwert aufgefüllt wird. – user2100493

+0

Probieren Sie 'console.log' das' object' var innerhalb Ihrer Methode in Server – Khang

Antwort

0

Das Problem war verrückter als ich erwartet hatte. Wenn Sie Meteorjs verwenden und das Aldeed Schema 2-Sammlungsframework verwenden, scheint es Aktualisierungen/Einfügungen von Json-Objekten vollständig zu ignorieren, auch wenn Sie den Feldtyp auf Objekt setzen, es sei denn, Sie richten genau das gleiche Schema wie das Objekt ein verschachtelte Array-Objekte) und hängen Sie sie an Ihre Sammlung an. Das dümmste Ding, das ich je gesehen habe, keine Ahnung, warum nichts davon warnt. Ich habe den Schemaanhang entfernt und es hat funktioniert.

0

Ich glaube, Ihr Problem aus dieser Linie ist stammen: [field]: object. Ich glaube nicht, dass dies eine geeignete Methode ist, dynamisch auf das Feld eines Objekts zuzugreifen. Stattdessen versuchen dynamisch das Feld zu aktualisieren, wie so:

'updateOneWorkflow': function(id, field, object) { 
    this.unblock; 
    if (Meteor.userId()) { 
     var _username = Meteor.user().username; 
     var newObj = { 
      "metadata": { 
       "last_modified_dt": new Date(), 
       "modified_by": Meteor.userId(), 
       "modified_by_username": _username 
      } 
     }; 
     newObj[field] = object; 
     MYCOLLECTION.update({ 
      _id: id 
     }, { 
      $set: newObj 
     }); 
    } else { 
     throw new Meteor.Error(403, "You are not authorized to perform this function"); 
    } 
} 
+0

gleiche Ergebnisse leider scheint nur die 3 Metadaten-Spalten zu aktualisieren, aber nicht das eigentliche Datenobjekt mit dem Objekt an die Funktion übergeben. Wird immer noch angezeigt als {} – user2100493

+0

@ user2100493 können Sie die Konsole auf dem Server anmelden, nur um sicher zu gehen, dass es auf dem Server ok ist? – Adam

+0

sicher, hier ist der Ausgang: { \t Metadaten: { \t \t last_modified_dt: "Mi 25. Januar 2017 19: 33: 01 GMT - 0500 (EST)", \t \t MODIFIED_BY: 't4hcAugBkr2ax6E3G', \t \t modified_by_username : 'ngaadmin' \t}, \t Daten: { \t \t Knoten: [ \t \t \t [Objekt] \t \t], \t \t Kanten: [], \t \t Ports: [], \t \t Gruppen: [] \t} } – user2100493