2017-04-10 2 views
0

Mein Mongoose BefehlMongoose werfen Sie müssen einen Feldfehler angeben, während eine Variable an Stelle einer expliziten Zeichenfolge

Modelname.update(
     {$and :[ {'field1' : field1}, {'field2' : field2}, {'field3' : field3}, {'field4' : field4}]}, 
     { 
      $set : {'timestamp' : timestamp}, 
      $inc : {speed_string: 1} 
     },{upsert: true}, function (err, record) 
     { 
      if (err) 
      { 

      } 
      else 
      { 

      } 
     }); 

Verwendung Wie Sie, dass speed_string sehen kann, ist eine Variable, die angeblich in der bekommen erhöht echtes Dokument oder hochgesetzt werden. Ich habe es kurz vor der Abfrage protokolliert und es ist in der Tat eine Zeichenfolge (und nicht leer, wie der Fehler liest), aber die Abfrage ist nicht durch und ich bekomme diesen Fehler.

"errmsg": " '$ inc' ist leer Sie ein Feld wie so angeben müssen. {$ Inc: {...}}"}

Wenn ich ersetzen Diese Variable mit 'expected_string' Dinge funktionieren gut und das ist mehr Verwirrung, dennoch.

Da ist etwas, was ich falsch mache, Hilfe wird geschätzt.

+0

Ich bemerkte auch dieses Problem. Feldindex muss eine Zeichenkette sein wie '{'speed_string': 1}' –

+0

@PavloZhukov Vielen Dank für Ihre Zeit Pavlo. Es muss einen Weg dafür geben ... Dinge funktionieren gut, im Falle von Pymongo für Python in einem ähnlichen Fall. –

+0

Und [API] (https://docs.mongodb.com/manual/reference/operator/update/inc/) sagt, es muss funktionieren, aber auf Übung auf Node.js funktioniert es nur, wenn es als String eingestellt ist. Ich war verwirrt davon –

Antwort

1

Um eine Variable als Feldnamen zu verwenden, müssen Sie die computed property name Syntax verwenden, wo die Variable in eckigen Klammern:

Modelname.update(
    {$and :[ {'field1' : field1}, {'field2' : field2}, {'field3' : field3}, {'field4' : field4}]}, 
    { 
     $set : {'timestamp' : timestamp}, 
     $inc : {[speed_string]: 1} 
    },{upsert: true}, function (err, record) 
    { 
     ... 
    }); 

Auch werden mehrere Begriffe in einer Abfrage implizit verknüpft, so können Sie vereinfachen Sie Ihr Anfrageobjekt zu:

Modelname.update(
    { 
     'field1' : field1, 
     'field2' : field2, 
     'field3' : field3, 
     'field4' : field4 
    }, 
    { 
     $set : {'timestamp' : timestamp}, 
     $inc : {[speed_string]: 1} 
    },{upsert: true}, function (err, record) 
    { 
     ... 
    }); 
+0

Ich bin mir bewusst, dass der zweite Teil einfach weiter ging. Danke, Mann. –

Verwandte Themen