Mongoose entfernt keine eingebetteten Dokumente
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
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.