Question

Je me gratter la tête ici, comme d'habitude, il semble avec des projets de nœud, et je ne sais pas si je fais quelque chose de mal ou si j'ai rencontré un bug.

J'ai un schéma de serveur qui peut avoir un certain nombre de documents intégrés appelés services. Je suis en cours d'exécution dans un problème bien où, même si je l'ai enlevé avec succès le service individuel de l'objet serveur, quand je le dis pour le sauver ne supprime pas de la base de données. La fonction de sauvegarde fonctionne parce qu'il est d'enregistrer les modifications que j'ai fait et pousse aussi dans les nouveaux documents sont intégrés, il est tout simplement pas enlever qui sont déjà là.

Voici un exemple relativement simplifiée de mon 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('/')
    });
  })
});

Ainsi, la suppression () supprime effectivement le service. Si je fais un server.toObject () avant que l'enregistrement, il est pas là. Toutes les idées pourquoi il ne serait pas le retirer de la base de données lors de l'enregistrement?

Edit: Je suppose que les numéros de version serait utile. node@0.4.2, mongoose@1.1.5 express@2.0.0rc

Était-ce utile?

La solution

J'ai trouvé un moyen de résoudre ce problème temporaire.

Ce que je l'ai fait est charger les documents intégrés dans un tableau, épissure celui à supprimer et remplacer le tableau. Quelque chose comme ceci:

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

Je sais que, en fonction de la taille du document, il sera

Autres conseils

Je peux me tromper, puisque je ne l'ai pas testé votre exemple, mais cela sonne comme mangouste ne détecte pas que le document incorporé est modifié.

A partir de la page de documentation types schéma :

Comme il est un type de schéma moins, vous pouvez changer la valeur à tout ce que vous voulez, mais Mongoose perd la capacité de détecter automatiquement / enregistrer ces modifications . Pour « dire » Mongoose que la valeur d'un type mixte a changé, appeler le .markModified (chemin) méthode du document qui passe le chemin du type mixte que vous venez de modifier.

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

Vous réponse pourrait être aussi simple que d'utiliser la fonction markModified ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top