MongoDB学习笔记二 Mongoose

Mongoose 简介

  • 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作
  • Mongoose就是一个让我们可以通过Node来操作MongoDB的模块
  • Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装, 并提供了更多的共嗯那个
  • 在大多数情况下, 它被用来把结构化的模式应用到一个MongoDB集合, 并提供了验证和类型转换等好处

Mongoose的好处

  • 可以为文档创建一个模式结构 (Schema)- 约束
  • 可以对模型中的对象/文档进行验证
  • 数据可以通过类型转换转换为对象模型
  • 可以使用中间件来应用业务逻辑挂钩
  • 比Node原生的MongoDB驱动更容易

新的对象

  • mongoose中为我们提供了几个新的对象

    • Schema对象定义约束了数据库中的文档结构
  • Model
    • Model 对象作为集合中的所有文档的表示, 相当于MongoDB数据库中的集合Collection
  • Document
    • Document表示集合中的具体文档, 相当于集合中的一个具体的文档

1. 通过Mongoose连接MongoDB

  • 使用Mongoose必须先安装mongoose

    • npm install mongoose
  • 加载Mongoose
    • const mongoose = require("mongoose");
  • 连接数据库
    • mongoose.connect("mongodb://地址")
    • 地址例子: mongodb://127.0.0.1/test
  • 断开连接
    • mongoose.disconnect()

**注意**: 如果端口号是默认端口号(27017) 则可以省略不写


2. 监听MongoDB数据库的连接状态 - connection

connection

  • 一旦连接了MongoDB数据库, 底层的Connection对象就可以通过mongoose模块的connection属性来访问
  • connection对象是对数据库连接的抽象, 它提供了对象连接、底层的Db对象和表示结合的Model对象的访问
  • 并且可以对connection对象上的事件进行监听, 来获悉数据库连接的开始与断开
  • 比如, 可以openclose事件来监控连接的打开和关闭

以上都是官方的废话, 简单来说:

  • 在mongoose对象中, 有一个属性叫做connection, 该属性表示的就是数据库连接

    • 通过监视该对象的状态, 可以来监听数据库的连接与断开

数据库连接成功的事件

mongoose.connection.once("open",function(){});

数据库连接断开的事件(一般不需要调用)

mongoose.connection.once("close",function(){});

3. helloMongose

// 01- helloMongose.js
// 引入mongoose模块
const mongoose = require("mongoose"); // 连接数据库
mongoose.connect("mongodb://localhost:27017/test"); // 测试是否连接成功
mongoose.connection.once("open", function () {
// 连接成功执行
console.log('连接成功~');
});

执行后可以看到已经成功连接上数据库了



但是注意: 在上面截图中我们可以看到有一行错误提示:



翻译过来意思为

  • 当前URL字符串解析器已弃用,并将在未来版本中删除。要使用新的解析器,请将选项{useNewUrlParser: true}传递给MongoClient.connect。
  • 这个报错不会影响程序运行, 但是按照规范,我们将代码改成下面这样
  • mongoose.connect("mongodb://localhost:27017/test",{useNewUrlParser: true ,useUnifiedTopology: true});

4. 创建Schema 模式对象

  • 使用Mongoose你必须经常定义模式
  • 模式为集合中的文档定义字段和字段类型
  • 如果你的数据是被结构化成支持模式的, 这是非常有用的
  • 简单来说, 模式就是对文档的约束, 有了模式, 文档中的字段必须符合模式的规定, 否则将不能正常操作

4.1 定义模式

  • 模式为集合中的文档定义字段和字段类型
  • 对于在模式中的每个字段, 你都需要定义一个特定的值类型, 受支持的类型如下:
    • String
    • Number
    • Boolean
    • Array
    • Buffer
    • Date
    • ObjectIdOid
    • Mixed
  • 需要为你计划使用的每个不同的文档类型都定义一个模式

4.2 创建模式定义

  • 模式需要通过mongooseSchema属性来创建, 这个属性是一个构造函数

    • new Schema(definition,option)

      • definition:描述模式
      • options: 配置对象, 定义数据库中集合的交互

4.3 options常用选项

  • autoIndex

    - 布尔值, 开启自动索引, 默认true
  • bufferCommands

    - 布尔值, 缓存由于连接问题无法执行的语句, 默认true
  • capped

    - 集合中最大文档数量
  • collection

    - 指定应用Schema的集合名称
  • id

    - 布尔值,是否有应用于_id的id处理器, 默认true
  • _id

    - 布尔值, 是否自动分配id字段,默认true
  • strict

    - 布尔值, 不符合Schema的对象不会被插入进数据库,默认true

4.4 代码

代码:

const mongoose = require("mongoose");

// 连接数据库
mongoose.connect("mongodb://localhost:27017/test",{useNewUrlParser: true ,useUnifiedTopology: true}); // 测试是否连接成功
mongoose.connection.once("open", function () {
// 连接成功执行
console.log('连接成功~');
}); // 创建Schema对象, 赋值给一个变量
const Schema = mongoose.Schema; // 创建Schema(模式)对象
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type:String,
default:'男'
},
address:String
});

这个时候还不能将数据插入到数据库中, 还需要定义 Model模型对象


5. Model模型对象

  • 创建模型对象需要使用mongoosemodel()方法,语法如下:

    • model(name.[schema],[collection],[skipInit])

      • name: 相当于模型的名字, 以后可以通过name找到模型
      • schema: 创建好要应用的模型对象
      • collection: 是要连接的集合名
      • skipInit: 是否跳过初始化, 默认是false
  • 一旦把一个Schema对象编译成一个Model对象, 你就完全准备好开始在模型中访问、添加、删除、更新和删除文档了。 也就是说有了模型以后我们就可以操作数据库了

5.1 实现代码

// 引入mongoose模块
const mongoose = require("mongoose"); // 连接数据库
mongoose.connect("mongodb://localhost:27017/test",{useNewUrlParser: true ,useUnifiedTopology: true}); // 测试是否连接成功
mongoose.connection.once("open", function () {
// 连接成功执行
console.log('连接成功~');
}); // 创建Schema对象, 赋值给一个变量
const Schema = mongoose.Schema; // 创建Schema(模式)对象
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type:String,
default:'男'
},
address:String
}); // 通过Scheme来创建Model
// Model代表的是数据库中的集合, 通过Model才能对数据库进行操作
// mongoose.model(modelName,schema);
// modelName: 就是要映射的集合名称, mongoose会自动将集合名变成复数
// schema: 创建的Schema对象 const stuModel = mongoose.model('student', stuSchema); // 向数据库中插入一个文档
// stuModel.create(doc,function(err){})
stuModel.create({
name: '小明',
age: 18,
gender: '男',
address:'上海'
}, function (err) {
if (!err) {
console.log('插入成功');
}
})

运行结果:

点开数据库后可以发现数据已经插入成功了

MongoDB学习笔记二- Mongoose的更多相关文章

  1. MongoDB学习笔记(二) 通过samus驱动实现基本数据操作

    传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由(database).集合(collection).文档对象(documen ...

  2. MongoDB学习笔记二:使用Docker安装MongoDB

    目录 Docker安装MongoDB Docker给MongoDB设置用户密码 NoSQL Manager for MongoDB连接 为admin赋权限 上一个笔记介绍了Windows下安装Mong ...

  3. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  4. Mongodb学习笔记二(Mongodb基本命令)

    第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...

  5. MongoDB学习笔记二:创建、更新及删除文档

    插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...

  6. MongoDB学习笔记(二)

    MongoDB的其他方法: 显示指定数目的数据: 1.在mongodb中查询指定数目的记录,可以使用: db.collectionname.find().limit(number); 2.在mongo ...

  7. Mongodb 学习笔记(二) :索引

    Mongodb 是基于集合建立索引 (Index),索引的作用类似于传统关系型数据库,目的是为了提高查询速度 . 如果没有建立索引, Mongodb  在读取数据时必须扫描集合中的 所有文档记录. 这 ...

  8. MongoDB学习笔记之Mongoose的使用

    http://blog.csdn.net/sinat_25127047/article/details/50560167

  9. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

随机推荐

  1. python -- 面向对象编程(类、对象)

    一.类 类是用来描述具有相同的属性和方法的对象的集合. 它定义了该集合中每个对象共同拥有的属性和方法. 类是一个独立的单位,它有一个类名,其内部包括成员变量和成员方法,分别用于描述对象的属性和行为. ...

  2. JAVA web环境搭建(使用Tomcat8整合httpd)

    说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建Tomcat并整合httpd的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查 ...

  3. 利用PhotoShop CS6进行抠图

    相信大家在前端开发中一定遇到过抠图,一个方形图有好多种方法可以扣出来你想要的图片,可是你知道怎么扣出一个圆形的图片吗?(另附ps破解办法 亲测可用) 一:我们需要安装ps软件并进行破解,这里进行下载破 ...

  4. Thinkphp 生成的验证码不显示问题解决

    在调用验证码之前加上   ob_clean(); 将: public function verify(){                $verify = new \Think\Verify();  ...

  5. 实现html页面转pdf

    实现方式比较简单,使用js代码实现的. 需要引入的js: 1.jQuery.js: 2.html2canvas.js(实现方式是先将Html页面转换成image图片然后在转换为pdf,所以转换之后会有 ...

  6. Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

    使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的: var client = DaprClient.CreateInvokeHttpClient(appId: " ...

  7. SpringBoot系列——动态定时任务

    前言 定时器是我们项目中经常会用到的,SpringBoot使用@Scheduled注解可以快速启用一个简单的定时器(详情请看我们之前的博客<SpringBoot系列--定时器>),然而这种 ...

  8. django有什么CMS比较好用?哪个好?

    这个网站有目前在电子商务领域流行的django cms的横向对比表格,可以看看 https://djangopackages.org/grids/g/ecommerce/ 从结果上来看,django- ...

  9. Java基础(一):I/O多路复用模型及Linux中的应用

    IO多路复用模型广泛的应用于各种高并发的中间件中,那么区别于其他模式他的优势是什么.其核心设计思想又是什么.其在Linux中是如何实现的? I/O模型 I/O模型主要有以下五种: 同步阻塞I/O:I/ ...

  10. 普通类中获取spring容器中的javabean对象

    spring提供了一系列的*Aware 接口,用于获取相应的对象,进行一系列的对象设置操作,此处实现ApplicationContextAware来获取ApplicationContext. 其他Aw ...