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. 光学动作捕捉系统中的反光标识点(Marker点)

    动作捕捉系统本质上是一种定位系统,通常需要在目标物布置定位设备进行追踪.以红外光学为原理的动作捕捉系统,主要由由光学镜头.动作捕捉软件.反光标识点.POE交换机.和若干配件组成,其中反光标识点(Mar ...

  2. Spring常见问题(五)

    1.静态资源访问配置 绝对路径:访问静态资源. <mvc:resources location="/js/" mapping="/js/**">&l ...

  3. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

  4. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【二】

    HarmonyOS内核开发-信号量开发案例学习记录   一.LiteOS里面的任务管理介绍: 任务状态通常分为以下四种: 就绪(Ready):该任务在就绪列表中,只等待CPU. 运行(Running) ...

  5. 构建前端第10篇之---Function.prototype.call()

    张艳涛写于2020-01-25,参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ ...

  6. Cookie、Session、JWT在koa中的应用及实现原理

    目录 Cookie 重要属性 实现原理 cookie签名实现原理 注意事项 Session 实现原理 JWT 使用方式 组成 实际应用 实现原理 前端存储方式 cookie session local ...

  7. Hadoop 3.1.1 - Yarn - 使用 GPU

    在 Yarn 上使用 GPU 前提 目前,Yarn 只支持 Nvidia GPU. YARN NodeManager 所在机器必须预先安装了 Nvidia 驱动器. 如果使用 Docker 作为容器的 ...

  8. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  9. tomcat启动时启动窗口出现乱码一招搞定

    先来看看问题(图示),在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码,虽然这些对tomcat本身的使用没有任何影响,但却非常碍眼,影响视觉效果! tomcat启动时启动窗口出现乱码的解决 ...

  10. shell——if、case例题

    目录 例题一:检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限 例题二:提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果 ...