2017-10-09 4 views
0

Ich kämpfe mit einem Update-Aufruf, der aus irgendeinem Grund nicht zu funktionieren scheint. Für einen kurzen Kontext haben wir eine Node.js-Anwendung, die auf Sails.js mit Waterline ORM ausgeführt wird.Nicht möglich, ein Element in ein MongoDB-Array innerhalb des Dokuments zu schieben, während Waterline

Wie pro meine package.json Datei, hier sind die Versionen ich verwende:

  • connect-Mongo:^1.3.2
  • mongodb:^2.2.29
  • Segel: ~ 0.12 0,4
  • Segel-mongo:^0.12.3

ich habe eine Sammlung "Produkte" und jedes Produkt sieht wie folgt in der Datenbank genannt:

{ 
    "_id" : ObjectId("59d5f12025423dc0261c911d"), 
    "category" : ObjectId("59a9bcf984d756998eaa22e5"), 
    "status" : "pendingReview", 
    "isDeleted" : false, 
    "events" : [ 
     { 
      "when" : 1507193120, 
      "actor" : "56cc0f76e1a25cde0d2c15ab", 
      "action" : "Submitted product", 
      "note" : "Jeff added this product. It is awaiting review." 
     } 
    ], 
    "productId" : "171005-00000", 
    "createdAt" : ISODate("2017-10-05T08:45:20.538Z"), 
    "updatedAt" : ISODate("2017-10-05T08:45:20.538Z") 
} 

Ich habe eine Benutzeroberfläche, wo ein Benutzer mehrere Produkte "genehmigen" kann, bevor sie Website-Besuchern angezeigt werden. Um dies zu tun, möchte ich einfach mehrere Datensätze aktualisieren, indem Sie den Schlüssel status in "approved" ändern und ein Ereignis im Array events jedes Dokuments hinzufügen. Das Ereignis muss sich an Position 0 des Arrays befinden. Ich versuche, diese Datensätze mit dem folgenden Code zu aktualisieren, aber es scheint nicht zu funktionieren:

var moment = require('moment'); 
Products.native(function(error, collection) { 

    if (error) { 
     throw error; 
    } 

    collection.update(
     { _id: ['59d5f12025423dc0261c911d'] }, 
     { 
      $set: { 
       status: 'approved', 
       $push: { 
        events: { 
         when: moment().unix(), 
         actor: req.body.userId, 
         action: 'Approved product', 
         note: req.body.userName + ' approved this product.' 
        } 
       } 
      } 
     }, 
     { multi: true }, 
     function(error, count, status) { 

     if (error) { 
      sails.log.error(error); 
      return res.serverError('Database error. Reference ID: ' + req.referenceId); 
     } 

     return res.ok(count); 
    }); 
}); 

Wenn ich diese Abfrage ausführen, ich habe keine Fehler bekommen und wenn ich meine Datenbank überprüfen, wird der Datensatz hat nicht aktualisiert Beim Ausführen der Abfrage erhalte ich folgende Daten:

{ 
    "ok": 1, 
    "nModified": 0, 
    "n": 0 
} 

Was passiert hier? Warum wird nicht aktualisiert? Wenn ich das richtig verstanden habe, kann die Abfrage das Dokument finden, aber es wird nicht aktualisiert. Ist das korrekt? Wenn ja, wie kann ich das beheben? Vielen Dank.

Antwort

1

$ push sollte auf dem gleichen Level wie $ set sein. Sie sind beide Betreiber ...

Das heißt, Sie wie folgt ändern sollte:

{ 
    $set: { 
     status: 'approved' 
    }, 
    $push: { 
     events: { 
      when: moment().unix(), 
      actor: req.body.userId, 
      action: 'Approved product', 
      note: req.body.userName + ' approved this product.' 
     } 
    } 
} 
+0

Das war es! Vielen Dank! – Nag

Verwandte Themen