Frage

Ich kratze hier den Kopf, wie es immer bei Knotenprojekten scheint, und ich bin mir nicht sicher, ob ich etwas falsch mache oder ob ich auf einen Fehler gestoßen bin.

Ich habe ein Serverschema, das eine beliebige Anzahl von eingebetteten Dokumenten namens Dienste haben kann. Ich stoße jedoch auf ein Problem, in dem ich jedoch den einzelnen Dienst erfolgreich aus dem Serverobjekt entfernt habe, wenn ich ihm sage, dass er ihn nicht aus der Datenbank entzieht. Die Save -Funktion funktioniert, da sie alle Änderungen speichert, die ich vorgenommen habe, und auch neue eingebettete Dokumente drängt. Sie entfernen einfach keine, die bereits vorhanden sind.

Hier ist ein relativ vereinfachtes Beispiel für meinen Code:

app.put('/server/:id', function(req, res, next){
  app.Server.findOne({_id: req.params.id}, function(err, server) {
    server.updated = new Date();
    ...

    for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){
      // Is this a new service or an existing one
      if (server.services[num]) {
        // Is it marked for deletion? If so, delete it
        if (req.body.server.services[num].delete == "true") {
          server.services[num].remove()
        } else { // else, update it
          server.services[num].type = req.body.server.services[num].type
          ...
        }
      } else {
        // It's new, add it
        delete req.body.server.services[num]["delete"]
        server.services.push(req.body.server.services[num]);
      }
    }

    server.save(function(err){
      if (!err) {
        req.flash('success', 'Server updated')
      } else {
        req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!')
        console.log(err)
      }
      res.redirect('/')
    });
  })
});

So entfernen die Entfernung () den Dienst tatsächlich. Wenn ich vor dem Speichern einen Server mache. Irgendwelche Ideen, warum es nicht aus der Datenbank entfernt würde, wenn sie speichert?

Bearbeiten: Ich nehme an, die Versionsnummern wären hilfreich. node@0.4.2, mongoose@1.1.5 express@2.0.0rc

War es hilfreich?

Lösung

Ich habe einen Weg gefunden, dieses Problem vorübergehend zu beheben.

Ich habe die eingebetteten Dokumente in ein Array geladen, das zu löschen und ersetzen Sie das Array. Etwas wie das:

var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...

Ich weiß, dass es je nach Größe des Dokuments wird

Andere Tipps

Ich könnte mich irren, da ich Ihr Beispiel nicht getestet habe, aber dies klingt so, als ob Mongoose nicht feststellt, dass das eingebettete Dokument geändert wird.

Von dem Schema -Typ -Dokumentationsseite:

Da es sich um einen Schema ohne Schema handelt, können Sie den Wert auf alles ändern, was Sie mögen, aber Mongoose verliert die Fähigkeit, diese Änderungen automatisch zu erkennen/zu speichern. Mongoose "sagen", dass sich der Wert eines gemischten Typs geändert hat, Rufen Sie den .markmodified (Pfad) an Methode des Dokuments, das den Pfad an den gemischten Typ übergibt, den Sie gerade geändert haben.

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

Sie antworten also möglicherweise so einfach wie die Markmodified () -Funktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top