sql >> Databáze >  >> NoSQL >> MongoDB

Transakce Mongo DB 4.0 s Mongoose &NodeJs, Express

s mongoose v Node.js, může mi někdo říct, jak lze tento výše uvedený kód znovu implementovat pomocí nejnovější funkce Transactions

Chcete-li používat podporu transakcí s více dokumenty MongoDB v mongoose, potřebujete verzi vyšší než v5.2. Například:

npm install [email protected]

Transakční metody Mongoose vrací spíše příslib než relaci, která by vyžadovala použití await . Viz:

  • Transakce v Mongoose
  • Blog:Pohled Node.JS na MongoDB 4.0:Transakce

Můžete například změnit příklad ve výše uvedeném zdroji a svůj příklad:

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

není atomický, vždy existuje možnost aktualizace uživatelské peněženky s částkou, ale související transakce se nevytvoří ve sbírce transakcí, což má za následek finanční ztrátu

Měli byste také zvážit změnu svých datových modelů MongoDB. Zvláště pokud jsou tyto dvě kolekce přirozeně propojeny. Další informace viz také Data modelu pro atomové operace.

Příkladem modelu, který můžete vyzkoušet, je model Event Sourcing. Nejprve vytvořte záznam transakce jako událost a poté pomocí agregace přepočítejte zůstatek v peněžence uživatele.

Například:

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

Poté zaveďte proces výpočtu množství pro každého uživatele za období jako mezipaměť v závislosti na požadavcích (tj. za 6 hodin). Zůstatek v peněžence aktuálního uživatele můžete zobrazit přidáním:

  • Poslední částka uložená v mezipaměti pro uživatele
  • Všechny transakce pro uživatele probíhají od poslední částky uložené v mezipaměti. tj. před 0–6 hodinami.



  1. Nasadit Meteor.js na example.com nebo www.example.com?

  2. MongoDB $acosh

  3. MongoDB, MapReduce a řazení

  4. Aktualizujte pole s více podmínkami v mongodb