当前位置: 首页 > article >正文

MongoDB mongoose 的 save、insert 和 create 方法的比较

目录

save 方法

insert 方法

create 方法

使用会话和事务

总结


在本文中,我们将介绍 MongoDB 中使用 mongoose 操作 数据库时的三种常见方法:save、insert 和 create。这些方法可以用于将数据存储到 MongoDB 数据库中,并且在一定程度上具有相似的功能。然而,它们之间还存在一些差异和适用场景上的区别。下面我们将逐一进行讲解。

:MongoDB 教程

save 方法

save 方法是 mongoose 中最常见的保存数据的方法,它可以保存一个已经存在的文档,也可以创建一个新的文档。当执行 save 方法时,mongoose 会先判断数据是否已经存在于数据库中,如果存在则更新数据,如果不存在则创建新的数据。

下面是一个使用 save 方法操作数据库的示例:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义数据模式
const userSchema = new Schema({
  name: String,
  age: Number,
  email: String
});

// 定义数据模型
const User = mongoose.model('User', userSchema);

// 创建一个文档实例
const user = new User({
  name: 'Tom',
  age: 28,
  email: 'tom@example.com'
});

// 保存数据到数据库
user.save()
  .then(() => {
    console.log('数据保存成功');
  })
  .catch(err => {
    console.log('数据保存失败:', err);
  });

insert 方法

insert 方法是一个底层的方法,它可以用来一次保存多个文档到 数据库中。与 save 方法不同的是,insert 方法不会触发 mongoose 定义的中间件和钩子函数,速度更快。

下面是一个使用 insert 方法操作数据库的示例:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义数据模式
const userSchema = new Schema({
  name: String,
  age: Number,
  email: String
});

// 定义数据模型
const User = mongoose.model('User', userSchema);

// 创建多个文档实例
const users = [
  { name: 'Tom', age: 28, email: 'tom@example.com' },
  { name: 'Jerry', age: 25, email: 'jerry@example.com' },
  { name: 'Alice', age: 30, email: 'alice@example.com' }
];

// 保存多个文档到数据库
User.insertMany(users)
  .then(() => {
    console.log('数据保存成功');
  })
  .catch(err => {
    console.log('数据保存失败:', err);
  });

create 方法

create 方法是一个可以同时创建并保存文档到数据库的方法。它与save 方法不同的是,create 方法可以直接传入一个对象,而不需要先创建文档实例。create 方法也会触发 mongoose 定义的中间件和钩子函数。

下面是一个使用 create 方法操作数据库的示例:

使用会话和事务

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

// 保存两个新文档。
await User.create({ name: 'O.O' }, { name: 'D.O' })

不幸的是,如果您想将选项传递给 create() 方法,比如您想使用 transactions,扩展语法会导致语法歧义。例如,下面的代码将尝试创建两个文档,而不是将第二个参数视为 options 对象。

const session = await User.startSession()
​
await session.withTransaction(async () => {
  // 注意,以下内容将不工作!它不是创建一个带有关联 session 的文档,而是创建两个没有 session 的文档!
  await User.create({ name: 'D.O' }, { session })
})

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

const session = await User.startSession()
​
await session.withTransaction(async () => {
  // 使用给定 session 创建一个文档。
  await User.create([{ name: 'D.O' }], { session })
})

总结

以上,我们介绍了  MongoDB 中 mongoose 的 save、insert 和 create 方法的使用。在选择方法时,可以根据实际需求和场景进行选择。

  • save 方法可用于保存已经存在的文档或新创建的文档,触发中间件和钩子函数。
  • insert 方法适用于批量插入文档,速度较快,不触发中间件和钩子函数。
  • create 方法适用于直接创建并保存文档,触发中间件和钩子函数。

根据具体情况选择合适的方法,可以更加高效地操作和管理 MongoDB 数据库中的数据。


http://www.kler.cn/news/329812.html

相关文章:

  • 算力共享系统中数据平面和控制平面
  • 富格林:正确指引远离欺诈黑幕
  • JAVASE总结
  • 学习threejs,添加环境光和点光源
  • 工具介绍---效率高+实用
  • 优化Mysql
  • [C++] 剖析AVL树功能的实现原理
  • 滚雪球学MySQL[11.2讲]:MySQL未来学习方向:大数据、云计算与迁移路径
  • [极客大挑战 2019]RCE ME1
  • Spring Security中自定义cors配置
  • 【算法篇】回溯算法类(1)(笔记)
  • 虚拟机U盘启动
  • 使用 Git 帮助文档
  • 养老院管理系统(含源码+sql+视频导入教程+文档)
  • 图解C#高级教程(四):协变、逆变
  • JSR303微服务校验
  • docker-compose 快速部署clickhouse集群
  • Springboot项目在win系统开发部署到linux服务器出现上传文件编码问题
  • 如何改善网站的核心网络生命力
  • TypeScript 封装 Axios 1.7.7
  • 软件测试面试八股文(含答案+文档)
  • 【yolov8】模型导出----pytorch导出为onnx模型
  • windows美化终端
  • go结构体默认值和校验器(go-defaults、go-validator)
  • 【Redis】主从复制(下)--主从复制原理和流程
  • 【数据分享】2001-2023年我国省市县镇四级的逐月平均气温数据(免费获取/Shp/Excel格式)
  • ubuntu 安装kvm 创建windos虚拟机
  • AMD 矩阵核心
  • 搜维尔科技:使用Xsens动作捕捉系统和ai训练人形机器人模仿人类运动,执行复杂任务
  • docker环境下配置cerbot获取免费ssl证书并自动续期