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()
中间件。
请登录后查看评论内容