MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Transactions Mongo DB 4.0 avec Mongoose &NodeJs, Express

avec mangouste dans Node.js, quelqu'un peut-il me dire comment ce code ci-dessus peut être réimplémenté à l'aide de la dernière fonctionnalité Transactions

Pour utiliser le support des transactions multi-documents MongoDB dans mongoose, vous avez besoin d'une version supérieure à v5.2. Par exemple :

npm install [email protected]

Les méthodes transactionnelles de Mongoose renvoient une promesse plutôt qu'une session qui nécessiterait d'utiliser await . Voir :

  • Transactions dans Mongoose
  • Blog :Une perspective Node.JS sur MongoDB 4.0 :Transactions

Par exemple, en modifiant l'exemple de la ressource ci-dessus et votre exemple, vous pouvez essayer :

const User = mongoose.model('Users', new mongoose.Schema({
  userId: String, wallet: Number
}));
const Transaction = mongoose.model('Transactions', new mongoose.Schema({
  userId: ObjectId, amount: Number, type: String
}));

await updateWallet(userId, 500);

async function updateWallet(userId, amount) {
  const session = await User.startSession();
  session.startTransaction();
  try {
    const opts = { session };
    const A = await User.findOneAndUpdate(
                    { _id: userId }, { $inc: { wallet: amount } }, opts);

    const B = await Transaction(
                    { usersId: userId, amount: amount, type: "credit" })
                    .save(opts);

    await session.commitTransaction();
    session.endSession();
    return true;
  } catch (error) {
    // If an error occurred, abort the whole transaction and
    // undo any changes that might have happened
    await session.abortTransaction();
    session.endSession();
    throw error; 
  }
}

n'est pas atomique, il y a toujours une possibilité que le portefeuille de l'utilisateur soit mis à jour avec le montant, mais la transaction associée n'est pas créée dans la collecte des transactions, ce qui entraîne une perte financière

Vous devriez également envisager de modifier vos modèles de données MongoDB. Surtout si les deux collections sont naturellement liées. Voir aussi Données de modèle pour les opérations atomiques pour plus d'informations.

Un exemple de modèle que vous pouvez essayer est le modèle Event Sourcing. Créez d'abord une entrée de transaction en tant qu'événement, puis recalculez le solde du portefeuille de l'utilisateur à l'aide de l'agrégation.

Par exemple :

{tranId: 1001, fromUser:800, toUser:99, amount:300, time: Date(..)}
{tranId: 1002, fromUser:77, toUser:99, amount:100, time: Date(..)}

Ensuite, introduisez un processus pour calculer le montant pour chaque utilisateur par période sous forme de cache en fonction des besoins (c'est-à-dire par 6 heures). Vous pouvez afficher le solde du portefeuille de l'utilisateur actuel en ajoutant :

  • Le dernier montant mis en cache pour l'utilisateur
  • Toutes les transactions de l'utilisateur se produisent depuis le dernier montant mis en cache. c'est-à-dire il y a 0 à 6 heures.