Mongoose non rimuoverà documenti incorporati
Domanda
sto graffiare la mia testa qui, come al solito, sembra con i progetti dei nodi, e non sono sicuro se sto facendo qualcosa di sbagliato o se ho incontrato un bug.
Ho uno schema di server che può avere qualsiasi numero di documenti incorporati cosiddetti servizi. Io corro in un problema, però, dove, anche se ho rimosso con successo il singolo servizio da l'oggetto server, quando dico che per salvarla non rimuove dal database. La funzione di salvataggio sta funzionando perché è salvare le modifiche che ho apportato ed è anche spingendo in nuovi documenti incorporati, è solo che non la rimozione di uno che sono già lì.
Ecco un esempio relativamente semplificata del mio codice:
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('/')
});
})
});
Così il remove () è in realtà la rimozione del servizio. Se faccio un server.toObject () prima del salvataggio, non è lì. Tutte le idee perché non sarebbe la rimozione dal database quando salva?
Edit: Credo che i numeri di versione sarebbe utile. node@0.4.2, mongoose@1.1.5 express@2.0.0rc
Soluzione
Ho trovato un modo per risolvere questo problema temporaneo.
Quello che ho fatto è caricare i documenti incorporati in un array, impiombare quella da eliminare e sostituire l'array. Qualcosa di simile a questo:
var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...
So che a seconda delle dimensioni del documento lo farà
Altri suggerimenti
I potrebbe essere sbagliato, dal momento che non ho provato il vostro esempio, ma questo suona come Mangusta non rileva che il documento incorporato viene modificato.
schema tipi pagina di documentazione :
Dato che si tratta di un tipo di schema-less, è possibile modificare il valore a qualsiasi altra cosa che ti piace, ma Mongoose perde la capacità di rilevare automaticamente / Salva le modifiche . Di "raccontare" Mongoose che il valore di un tipo misto è cambiato, chiamare il .markModified (percorso) il metodo del documento passare il percorso del tipo misto appena modificato.
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
Così si potrebbe essere semplice come utilizzare la funzione markModified () risposta.