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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top