MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo DB 4.0 Транзакции с Mongoose &NodeJs, Express

с mongoose в Node.js, някой може ли да ми каже как този по-горе код да се внедри отново с помощта на най-новата функция за транзакции

За да използвате поддръжка на транзакции с множество документи в MongoDB в mongoose, ви е необходима версия, по-голяма от v5.2. Например:

npm install [email protected]

Транзакционните методи на Mongoose връщат обещание, а не сесия, която изисква използването на await . Вижте:

  • Транзакции в Mongoose
  • Блог:Перспектива на Node.JS за MongoDB 4.0:Транзакции

Например, променяйки примера на ресурса по-горе и вашия пример, можете да опитате:

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

не е атомно, винаги има възможност потребителският портфейл да бъде актуализиран със сума, но свързаната транзакция не е създадена при събирането на транзакции, което води до финансова загуба

Трябва също да помислите за промяна на вашите модели на данни MongoDB. Особено ако двете колекции са естествено свързани. Вижте също Данни за модела за атомни операции за повече информация.

Примерен модел, който можете да опитате, е моделът за извор на събития. Създайте запис за транзакция първо като събитие, след което преизчислите баланса на портфейла на потребителя, като използвате агрегиране.

Например:

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

След това въведете процес за изчисляване на количеството за всеки потребител за период като кеш в зависимост от изискванията (т.е. за 6 часа). Можете да покажете баланса на портфейла на текущия потребител, като добавите:

  • Последната кеширана сума за потребителя
  • Всички транзакции за потребителя се извършват след последната кеширана сума. т.е. преди 0-6 часа.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Извличане само на заявения елемент в масив от обекти в колекцията MongoDB

  2. Преглед на валидирането на схемата на MongoDB

  3. Най-популярните NoSQL бази данни, поддържани от ClusterControl

  4. MongoDB - Актуализиране или вмъкване на обект в масив

  5. Получаване на списък с уникални вградени/вложени обекти в документ на MongoDB