Mongodb 事务 - 无法从快照读取

Ayu*_*ani 5 transactions mongoose mongodb node.js

我正在尝试使用 mongoose 进行 MongoDB 事务,但在每次创建数据库并插入用户和公司的请求时,我都会收到以下错误

“由于待处理的集合目录更改,无法读取快照;请重试该操作。快照时间戳为 Timestamp(1584451745, 1)。集合最小值为 Timestamp(1584451753, 1)”

重试请求后,它起作用了。但是,当我发送新请求来创建新数据库并插入用户和公司时,我收到相同的错误。我总是需要重试请求才能成功插入数据。

const session = await mongoose.startSession();
session.startTransaction();

try {
  await db.createCollection("users");
  await db.createCollection("companies");

  const savedUser = await UserModel({
    ...userDetails,
  }).save({ session });


  const company = await new CompanyModel({
    ...companyDetails
  }).save({ session });


  await session.commitTransaction();

  return { message: "User Added Successfully" };

} catch (err) {
  error("Transaction Error", err);
  await session.abortTransaction();
  throw err;
} finally {
  session.endSession();
}
Run Code Online (Sandbox Code Playgroud)

知道我在这里缺少什么吗?

Nod*_*rov 9

好吧,我明白了。根据 mongoose 文档,您需要在使用事务之前创建集合:

\n
Model.createCollection()\nParameters\n[options] \xc2\xabObject\xc2\xbb see MongoDB driver docs\n[callback] \xc2\xabFunction\xc2\xbb\n
Run Code Online (Sandbox Code Playgroud)\n
\n

为此模型创建集合。默认情况下,如果未指定索引,mongoose 将不会为模型创建集合,直到创建任何文档。使用此方法显式创建集合。

\n
\n
\n

注意1:您可能需要在开始交易之前调用此方法请参阅https://docs.mongodb.com/manual/core/transactions/#transactions-and-operations

\n
\n

来源: https: //mongoosejs.com/docs/api.html#model_Model.createCollection

\n