web-dev-qa-db-fra.com

Mongoose: rechercher, modifier, sauvegarder

J'ai un modèle Mongoose User:

var User = mongoose.model('Users',
    mongoose.Schema({
        username: 'string',
        password: 'string',
        rights: 'string'
    })
);

Je veux trouver une instance du modèle User, modifier ses propriétés et enregistrer les modifications. C'est ce que j'ai essayé (c'est faux!):

User.find({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});

Quelle est la syntaxe pour rechercher, modifier et enregistrer une instance du modèle User?

40
Randomblue

Pourquoi ne pas utiliser Model.update ? Après tout, vous n'utilisez pas l'utilisateur trouvé pour autre chose que de mettre à jour ses propriétés:

User.update({username: oldUsername}, {
    username: newUser.username, 
    password: newUser.password, 
    rights: newUser.rights
}, function(err, numberAffected, rawResponse) {
   //handle it
})
48
soulcheck

Le paramètre user de votre rappel est un tableau avec find. Utilisez findOne au lieu de find lorsque vous interrogez une seule instance.

User.findOne({username: oldUsername}, function (err, user) {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
105
JohnnyHK

Je voulais ajouter quelque chose de très important. J'utilise beaucoup la méthode JohnnyHK mais j'ai remarqué que parfois les modifications ne persistaient pas dans la base de données. Quand j'ai utilisé .markModified cela a fonctionné.

User.findOne({username: oldUsername}, function (err, user) {
   user.username = newUser.username;
   user.password = newUser.password;
   user.rights = newUser.rights;

   user.markModified(username)
   user.markModified(password)
   user.markModified(rights)
    user.save(function (err) {
    if(err) {
        console.error('ERROR!');
    }
});
});

informez mongoose du changement avec doc.markModified ('pathToYourDate') avant de sauvegarder.

4
jack blank

Si vous souhaitez utiliser find, comme pour toute validation que vous souhaitez effectuer côté client.

find retourne un tableau d'objets

findOne ne renvoie qu'un objet

Ajouter user = user[0] a fait que la méthode de sauvegarde fonctionne pour moi.

Voici où vous le mettez.

User.find({username: oldUsername}, function (err, user) {
    user = user[0];
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.save(function (err) {
        if(err) {
            console.error('ERROR!');
        }
    });
});
3
Gulfaraz Yasin

findOne , modifiez les champs et enregistrez

User.findOne({username: oldUsername})
  .then(user => {
    user.username = newUser.username;
    user.password = newUser.password;
    user.rights = newUser.rights;

    user.markModified('username');
    user.markModified('password');
    user.markModified('rights');

    user.save(err => console.log(err));
});

OU findOneAndUpdate

User.findOneAndUpdate({username: oldUsername}, {$set: { username: newUser.username, user: newUser.password, user:newUser.rights;}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }
    console.log(doc);
});

Voir aussi pdateOne

2
Anthony Awuley

Vous pouvez aussi écrire un peu plus propre en utilisant updateOne & $ set, plus async/wait.

const updateUser = async (newUser) => {
  try {
    await User.updateOne({ username: oldUsername }, {
      $set: {
        username: newUser.username,
        password: newUser.password,
        rights: newUser.rights
      }
    })
  } catch (err) {
    console.log(err)
  }
}

Comme vous n'avez pas besoin du document résultant, vous pouvez simplement utiliser updateOne au lieu de findOneAndUpdate.

Voici une bonne discussion sur la différence: MongoDB 3.2 - Cas d’utilisation pour updateOne par findOneAndUpdate

1
Deaconu Dan Andrei