2014-09-19 4 views
1

Supposons que vous ayez une application où une opération simple de l'utilisateur implique la mise à jour plusieurs documents de différentes collections.MongoDB - Comment faire pour que plusieurs mises à jour soient toutes réussies?

J'ai fait deux ;-) des questions

Quelle est la meilleure façon de le faire, et comment faire en sorte que soit tout est correctement enregistré ou l'opération est annulée?

Im utilisant Mongoose

Solution A - callbacks emboîtées

En supposant que les deux userId et eventId sont fournies par côté client appel POST ou par prise

User.findById(userId,{},function(err,myUser){ 

    if(err){ 
      console.log('Error updating user...'); 
      return; 
      } 
    else{ 
      Event.findById(eventId,{},function(err,myEvent){ 

      if(err){ 
        console.log('Error updating user's Event...'); 
        return; 
      }else{ 
       console.log('Both user and event were successfully updated'); 
       socket.emit('Update success!') || res.send(...); 
      }); 
    }); 

Solution B - Appels parallèles

User.findById(userId,{},function(err,myUser){ 

    if(err){ 
      console.log('Error updating user...'); 
      return; 
      } 
    else{ 
      console.log('Success updating user'); 
      socket.emit('..') || res.send('...'); 

    }); 

Event.findById(eventId,{},function(err,myEvent){ 

      if(err){ 
        console.log('Error updating user's Event...'); 
        return; 
      }else{ 
       console.log('Success updating Event'); 
       socket.emit('Update success!') or res.send(...); 
      }); 

En supposant que userId et eventId sont connus depuis le début, la solution B semble évidemment plus rapide. Quoi qu'il en soit, dans les deux cas, comment s'assurer d'effectuer une opération WRITE sur la base de données seulement si TOUTES les opérations d'écriture ont été un succès?

Est-ce que le fait que je doive faire cela signifie que mon schéma n'était pas bien conçu, et que je devrais fusionner des informations?

Merci pour vos réponses

+0

Cela me suggère que vous vouliez vraiment de l'ACID et que vous deviez revenir à une base de données relationnelle. – duffymo

Répondre

1

Vous pouvez utiliser BulkOperations et faire quelque chose comme ceci:

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.find({ status: "D" }).update({ $set: { status: "I", points: "0" } }); 
bulk.find({ item: null }).update({ $set: { item: "TBD" } }); 
bulk.execute(); 

Référence: http://docs.mongodb.org/manual/reference/method/Bulk.find.update/

bulk.execute(); retournera un BulkWriteResult qui contient le résultat des opérations en bloc et, dans ce cas, les documents nModified: http://docs.mongodb.org/manual/reference/method/BulkWriteResult/#BulkWriteResult

Cependant, je pense qu'il n'y a aucun moyen d'exécuter des opérations en masse depuis mongoose depuis la publication de MongoDb 2.6.

Questions connexes