Je voudrais mettre à jour un document qui implique la lecture d'autres collections et modifications complexes, donc les opérateurs de mise à jour dans findAndModify()
ne peuvent pas servir mon but.Gestion des conflits dans trouver, modifier, enregistrer le flux dans MongoDB avec Mongoose
Voici ce que je:
Collection.findById(id, function (err, doc) {
// read from other collection, validation
// modify fields in doc according to user input
// (with decent amount of logic)
doc.save(function (err, doc) {
if (err) {
return res.json(500, { message: err });
}
return res.json(200, doc);
});
}
Mon inquiétude est que ce flux pourrait provoquer des conflits si plusieurs clients modifie des le même document.
On dit que here:
Opérations sur un document unique sont toujours atomique avec des bases de données MongoDB
Je suis un peu confus au sujet de ce que signifie Operations
.
- Est-ce que cela signifie que le
findById()
acquerrons le verrou jusqu'àdoc
est hors de portée (après la réponse est envoyée), donc il n'y aurait pas de conflits? (Je ne pense pas) - Si non, comment modifier mon code pour supporter plusieurs clients sachant qu'ils vont modifier Collection?
- Est-ce que Mongoose signale un conflit s'il survient?
- Comment gérer le conflit possible? Est-il possible de verrouiller manuellement la collection?
- Je vois la suggestion d'utiliser
versionKey
de mangouste (ou horodatage) et une nouvelle tentative pour le document périmé - Ne pas utiliser MongoDB tout à fait ...
- Je vois la suggestion d'utiliser
Merci.
EDIT
Merci @jibsales pour le pointeur, j'utilise maintenant versionKey
(horodatage travaillera également) de mangouste pour éviter les conflits livrez.
aaronheckmann — Mongoose v3 part 1 :: Versioning
Voir cet exemple de code:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8
Avez-vous du code asynchrone dans votre bloc de commentaire (de logique supplémentaire)? Il semble que vous le faites, auquel cas vous pourriez finir par sauvegarder des données obsolètes. Vous pourriez avoir du succès avec quelque chose comme ceci: https://www.npmjs.org/package/mongoose-timestamp. – dylants
Oui, j'ai également trouvé quelques suggestions pour utiliser la version de Mongoose et réessayer pour le document périmé. Est-ce ce que vous suggérez? – leesei