sql >> Base de Datos >  >> NoSQL >> MongoDB

Transacciones de Mongo DB 4.0 con Mongoose y NodeJs, Express

con mongoose en Node.js, ¿alguien puede decirme cómo se puede volver a implementar este código anterior usando la función Transacciones más reciente?

Para usar el soporte de transacciones de documentos múltiples de MongoDB en mongoose, necesita una versión superior a v5.2. Por ejemplo:

npm install [email protected]

Los métodos transaccionales de Mongoose devuelven una promesa en lugar de una sesión que requeriría usar await . Ver:

  • Transacciones en Mongoose
  • Blog:Una perspectiva de Node.JS en MongoDB 4.0:Transacciones

Por ejemplo, modificando el ejemplo del recurso anterior y su ejemplo, puede probar:

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

no es atómico, siempre existe la posibilidad de que la billetera del usuario se actualice con el monto, pero la transacción relacionada no se crea en la recopilación de transacciones, lo que resulta en una pérdida financiera

También debe considerar cambiar sus modelos de datos MongoDB. Especialmente si las dos colecciones están naturalmente unidas. Consulte también Datos del modelo para operaciones atómicas para obtener más información.

Un modelo de ejemplo que podría probar es el modelo Event Sourcing. Cree una entrada de transacción primero como un evento, luego vuelva a calcular el saldo de la billetera del usuario mediante la agregación.

Por ejemplo:

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

Luego, introduzca un proceso para calcular la cantidad para cada usuario por período como un caché según los requisitos (es decir, por 6 horas). Puede mostrar el saldo de la billetera del usuario actual agregando:

  • La última cantidad almacenada en caché para el usuario
  • Cualquier transacción para el usuario ocurre desde el último monto almacenado en caché. es decir, hace 0-6 horas.