Mongoose 模型有一个 create() 函数 常用于创建新文档:

const User = mongoose.model(User, mongoose.Schema({
  email: String
}));

const doc = await User.create({ email: bill@microsoft.com });
doc instanceof User; // true
doc.email; // bill@microsoft.com

create() 函数是围绕 save() 功能 。以上 create() 调用相当于:

const doc = new User({ email: bill@microsoft.com });
await doc.save();

最常见的使用原因 create() 是你可以方便地 save() 通过传递对象数组,使用单个函数调用多个文档:

const User = mongoose.model(User, mongoose.Schema({
  email: String
}));

const docs = await User.create([
  { email: sergey@google.com },
  { email: bill@microsoft.com }
]);
docs[0] instanceof User; // true
docs[0].email; // sergey@google.com
docs[1].email; // bill@microsoft.com

带有会话和事务

除了传递对象数组之外, create() 还支持传入单个对象或多个对象。 例如下面是另一种创建多个文档的方法。

// Saves two new documents.
await User.create({ email: sergey@google.com }, { email: bill@microsoft.com });

如果您想将选项传递给 create() 功能,比如如果你想使用 transactions 。 例如下面的代码将尝试创建两个文档,而不是将第二个参数视为 options 目的。

const session = await User.startSession();

await session.withTransaction(async () => {
  // Be careful, the below does **not** work! Instead of creating one document with the
  // associated session, it creates two documents with no session!
  await User.create({ email: sergey@google.com }, { session });
});

正因为如此,如果你想使用 create() 在事务中,您 必须 将文档作为数组传递,即使您只创建一个文档。

const session = await User.startSession();

await session.withTransaction(async () => {
  // Creates one document with the given session. Note the `[]`!
  await User.create([{ email: sergey@google.com }], { session });
});

相对 insertMany()

模型也有 insertMany() 函数 语法类似的 create()

const User = mongoose.model(User, mongoose.Schema({
  email: String
}));

const [doc] = await User.insertMany([{ email: bill@microsoft.com }]);
doc instanceof User; // true
doc.email; // bill@microsoft.com

最大的不同在于 insertMany() 最终成为一个原子 insertMany() Mongoose 发送到 MongoDB 服务器的命令,但是 create() 最终成为一堆分开的 insertOne() 调用。 虽然这意味着 insertMany() 通常更快,这也意味着 insertMany() 更容易受到 卡顿 。 因此,我们建议使用 create() 代替 insertMany(),除非您愿意冒险减慢其他操作以使批量插入速度更快。

另一个区别是 create() 触发器 save() 中间件 ,因为 create() 来电 save() 内部。 insertMany() 不触发 save() 中间件,但它确实触发 insertMany() 中间件。

© 版权声明
评论 抢沙发

请登录后发表评论