Mongoose 中的 create() 函数介绍
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 技术交流群。
上一篇: Mongoose 中的时间戳使用
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论