Mongoose 中的 create() 函数介绍

发布于 2022-09-11 14:13:48 字数 3363 浏览 201 评论 0

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() 中间件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

世俗缘

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

eins

文章 0 评论 0

世界等同你

文章 0 评论 0

毒初莱肆砂笔

文章 0 评论 0

初雪

文章 0 评论 0

miao

文章 0 评论 0

qq_zQQHIW

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文