sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongo DB 4.0 Transaktioner med Mongoose &NodeJs, Express

med mongoose i Node.js, kan nogen fortælle mig, hvordan denne ovenstående kode genimplementeres ved hjælp af den seneste transaktionsfunktion

For at bruge MongoDB multi-dokument transaktioner understøttelse i mongoose du har brug for version større end v5.2. For eksempel:

npm install [email protected]

Mongoose-transaktionsmetoder returnerer et løfte i stedet for en session, som ville kræve at bruge await . Se:

  • Transaktioner i Mongoose
  • Blog:A Node.JS Perspective on MongoDB 4.0:Transactions

Hvis du for eksempel ændrer eksemplet på ressourcen ovenfor og dit eksempel, kan du prøve:

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; 
  }
}

er ikke atomær er der altid mulighed for, at brugerens tegnebog opdateres med beløb, men relateret transaktion er ikke oprettet i transaktionsindsamling, hvilket resulterer i økonomisk tab

Du bør også overveje at ændre dine MongoDB-datamodeller. Især hvis de to samlinger er naturligt forbundet. Se også Modeldata for Atomic Operations for mere information.

Et eksempel på en model, du kan prøve, er Event Sourcing-modellen. Opret først en transaktionspost som en hændelse, og genberegn derefter brugerens pungsaldo ved hjælp af aggregering.

For eksempel:

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

Indfør derefter en proces til at beregne mængden for hver bruger pr. periode som en cache afhængigt af kravene (dvs. pr. 6 timer). Du kan få vist den aktuelle brugers pungsaldo ved at tilføje:

  • Det sidste cachelagrede beløb for brugeren
  • Alle transaktioner for brugeren er sket siden det sidste cachelagrede beløb. dvs. 0-6 timer siden.



  1. MongoDB:Hvad er forbindelsespooling og timeout?

  2. MongoDB opretter ikke database i shell

  3. Max Forsøg overskredet Undtagelseskø laravel

  4. Sådan begrænser du antallet af opdateringsdokumenter i mongodb