MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Transakcje Mongo DB 4.0 z Mongoose i NodeJs, Express

z mangustą w Node.js, czy ktoś może mi powiedzieć, jak ten powyższy kod może zostać ponownie zaimplementowany przy użyciu najnowszej funkcji Transakcje

Aby korzystać z obsługi transakcji wielodokumentowych MongoDB w Mongoose, potrzebujesz wersji wyższej niż v5.2. Na przykład:

npm install [email protected]

Metody transakcyjne Mongoose zwracają obietnicę, a nie sesję, która wymagałaby użycia await . Zobacz:

  • Transakcje w Mongoose
  • Blog:perspektywa Node.JS na MongoDB 4.0:transakcje

Na przykład, zmieniając przykład w powyższym zasobie i w swoim przykładzie, możesz spróbować:

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

nie jest atomowa, zawsze istnieje możliwość zaktualizowania portfela użytkownika o kwotę, ale powiązana transakcja nie została utworzona w kolekcji transakcji, co powoduje straty finansowe

Należy również rozważyć zmianę modeli danych MongoDB. Zwłaszcza jeśli obie kolekcje są ze sobą naturalnie połączone. Zobacz także Dane modelu dla operacji atomowych, aby uzyskać więcej informacji.

Przykładowym modelem, który możesz wypróbować, jest model Event Sourcing. Najpierw utwórz wpis transakcji jako zdarzenie, a następnie ponownie oblicz saldo portfela użytkownika za pomocą agregacji.

Na przykład:

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

Następnie wprowadź proces obliczania ilości dla każdego użytkownika na okres jako pamięć podręczna w zależności od wymagań (tj. na 6 godzin). Możesz wyświetlić saldo portfela bieżącego użytkownika, dodając:

  • Ostatnia ilość w pamięci podręcznej dla użytkownika
  • Wszelkie transakcje dla użytkownika mają miejsce od ostatniej zapisanej w pamięci podręcznej kwoty. tj. 0-6 godzin temu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB łączy dane w tablicy obiektów

  2. Jak wykonać skrypt MongoDB js za pomocą Java MongoDriver?

  3. Mongodb:Zapytanie o obiekt json zagnieżdżony w tablicy

  4. Mongusta:schemat kontra model?

  5. Znajdź dokumenty z tablicą, która nie zawiera określonej wartości