在 Mongoose 事务中使用 `create()` 验证错误

The*_*ner 3 transactions mongoose mongodb

我正在使用 mongoose 测试事务并尝试使用以下代码完成一个非常简单的任务:

      const session = await mongoose.startSession();
      session.startTransaction();
      try {
        const opts = { session, new: true };
        const A = await Author.
        create({
          firstName: 'Jon',
          lastName: 'Snow'}, session);
        if(!A) throw new Error('Aborted A by Amit!');
        const B = await Author.
        findOneAndUpdate({firstName: 'Bill'}, {firstName: 'William'}, opts);
        if(!B) throw new Error('Aborted B by Amit!');
        await session.commitTransaction();
        session.endSession();
      } catch (err) {
        await session.abortTransaction();
        session.endSession();
        throw err;
      }
Run Code Online (Sandbox Code Playgroud)

我要做的就是首先将create()一个新文档插入(使用 mongoose方法)到一个集合中,然后findOneAndUpdate()在同一个集合中编辑(使用 Mongo方法)另一个文档。任一查询失败都需要中止整个事务套件。

create()似乎给我带来了问题。该文档确实被创建并插入,但是,它也会引发错误:

“作者验证失败:lastName:PathlastName是必需的。firstName:PathfirstName是必需的。”

知道这意味着什么吗?尽管我已经给了它,但它似乎在抱怨没有为required字段 (firstNamelastName)提供值。

Wan*_*iar 5

我不知道为什么当我提供了它们并且它们仍然被添加到集合中时它会抱怨缺失值!

这是因为Model.create() 的第一个参数接受要插入的文档,作为数组或作为扩展。例如,这两个是等价的:

// pass a spread of docs
Candy.create({ type: 'jelly bean' }, { type: 'snickers' }) 

// pass an array of docs 
Candy.create([{ type: 'jelly bean' }, { type: 'snickers' }])
Run Code Online (Sandbox Code Playgroud)

您的行的问题在于,它试图将第二个文档{session: session}作为 的另一个条目Author,该条目缺少必填字段firstNamelastName字段。

相反,你应该这样做:

Author.create([{ firstName: 'Quentin', lastName: 'Tarantino' }], 
               { session: session }
);
Run Code Online (Sandbox Code Playgroud)

您还可以在 Mongoose 中找到Transactions一个有用的参考。