MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Giao dịch Mongo DB 4.0 với Mongoose &NodeJs, Express

với mongoose trong Node.js, có ai có thể cho tôi biết cách thực hiện lại đoạn mã ở trên này bằng cách sử dụng tính năng Giao dịch mới nhất không

Để sử dụng hỗ trợ giao dịch đa tài liệu MongoDB trong mongoose, bạn cần phiên bản lớn hơn v5.2. Ví dụ:

npm install [email protected]

Các phương thức giao dịch Mongoose trả về một lời hứa chứ không phải một phiên yêu cầu sử dụng await . Xem:

  • Giao dịch trong Mongoose
  • Blog:Góc nhìn Node.JS về MongoDB 4.0:Giao dịch

Ví dụ:thay đổi ví dụ trên tài nguyên ở trên và ví dụ của bạn, bạn có thể thử:

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

không phải là nguyên tử, luôn có khả năng ví của người dùng được cập nhật số tiền nhưng giao dịch liên quan không được tạo trong bộ sưu tập giao dịch dẫn đến tổn thất tài chính

Bạn cũng nên xem xét việc thay đổi các mô hình dữ liệu MongoDB của mình. Đặc biệt nếu hai bộ sưu tập được liên kết tự nhiên. Xem thêm Dữ liệu mô hình cho Hoạt động nguyên tử để biết thêm thông tin.

Một mô hình ví dụ mà bạn có thể thử là mô hình Tìm nguồn cung ứng sự kiện. Trước tiên, hãy tạo mục nhập giao dịch dưới dạng sự kiện, sau đó tính toán lại số dư ví của người dùng bằng cách sử dụng tổng hợp.

Ví dụ:

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

Sau đó, giới thiệu một quy trình để tính toán số tiền cho mỗi người dùng trong mỗi khoảng thời gian dưới dạng bộ nhớ cache tùy thuộc vào yêu cầu (tức là mỗi 6 giờ). Bạn có thể hiển thị số dư ví của người dùng hiện tại bằng cách thêm:

  • Số tiền được lưu trong bộ nhớ cache cuối cùng cho người dùng
  • Mọi giao dịch cho người dùng xảy ra kể từ số tiền được lưu trong bộ nhớ cache cuối cùng. tức là 0-6 giờ trước.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose Query để lọc một mảng và điền nội dung liên quan

  2. MongoDB $ hoặc Nhà điều hành đường ống tổng hợp

  3. Loại bỏ database.yml khi sử dụng Mongoid trong Rails 3.2

  4. $ lookup trên ObjectId's trong một mảng

  5. Sửa lỗi "$ pullAll yêu cầu một đối số mảng nhưng đã được cung cấp một đôi" trong MongoDB