前言
对于nodejs而言,标配但数据库便是mongodb了。而我认为nodejs对于mongodb的操作最为便捷的插件之一就是mongoose,所有我们去掌握mongoose的基本配置就很有必要了,本章主要和大家分享下mongoose的学习使用经验。
网络异常,图片无法展示
|
操作使用
首先我们需要了解mongodb是一款什么样的数据库,MongoDB 是一个介于关系数据库和非关系数据库之间的开源产品,是最接近于关系型数据库的 NoSQL 数据库。
安装mongodb
//ubuntu sudo apt-get install mongodb //centos sudo yum install mongodb
注:window/mac系统官网下载安装包
启动数据库
//window环境启动 1、打开命令窗口,切换到mongodb安装目录下的“bin”目录中。 2、启动服务。输入命令:mongod --dbpath ***\MongoDB\data 注:--dbpath指定数据库存放目录(目录需要提前建好) 3.命令行打印启动信息则启动成功 4.在浏览器中输入http://localhost:27017/可以打开一个mongodb提示页面 //linux环境启动(ubuntu为例) 1.sudo service mongodb start 2.打印启动信息
连接mongodb常用工具
- 开源工具compass:免费,界面简洁,不支持 sql 查询,支持性能监控
- studio 3t:收费,但是可以免费试用30天。支持导入导出,支持 sql 查询,支持语法填充,功能丰富
- 其他的如:NoSQLBooster robot 3t ...
注:mongodb默认没有权限认证,所以我们在使用gui工具是只用输入host和端口好就可以连接。
权限设置(ubuntu为例)
- 创建用户
//进入命令行 mongo //使用admin use admin //创建管理用户 db.addUser('admin','112233') //创建其他数据库用户 use test db.addUser('test','112233')
创建成功,Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
- 修改配置文件
//打开配置文件/etc/mongodb.conf vim /etc/mongodb.conf auth=true
记得保存后退出文件编辑
- 重启服务
//重启服务是配置生效 service mongodb restart
- 测试权限
mongo show databases; 报错: /** 2020-08-09T22:56:34.914+0800 listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13 } at src/mongo/shell/mongo.js:47 */ //登录 use admin; db.auth('admin','112233')//1 show databases; //显示所有数据
- 查询所有用户
use admin; db.auth('admin','112233') show collections; /** system.indexes system.users system.version */ db.system.users.find()
注:mongodb默认没有开启权限认证,所以大家在使用前一定要先开启这块功能。
基本操作,常用sql命令
- 数据库类
//创建数据库连接成功使用use创建并切换数据库 use test; //查询数据库 show dbs; //查询当前使用数据库 db; //删除数据库 db.dropDatabase();
- 集合类
//创建集合 db.createCollection('test',{}) //查询集合 show collections; //查询集合所有文档 db.collection.find();
- 文档类
//插入文档 db.collection.insert({id:3,test:'33'}) db.collection.save({id:3,test:'33'}) //插入多条 db.collection.insertMany( [ ], { writeConcern: <document>, ordered: <boolean> } ) //查询文档 db.collection.find({id:3}) //修改文档 db.collection.update({id:3},{test:'555'}) //删除文档 db.test.remove({id:4})
- 操作符
(>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte
基本概念
数据持久化方式
MongoDB 是一个基于分布式文件存储的数据库。 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- 存储方式:虚拟内存+持久化
- 非关系型:就是没用遵循关系代数模式的数据库。
- 数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
实例 数据库 集合 文档 字段
- 实例:mongodb的服务
- 数据库:MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
- 集合:
1.MongoDB 文档组(类似关系型数据库中的表格)。 2.在于数据库中并且没有固定的结构。 3. 集合可以插入不同格式和类型的数据
- 文档:
1.文档是一组键值(key-value)对(即 BSON)。 2.MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。
索引 聚合 复制
- MongoDB使用 createIndex() 方法来创建索引。
db.collection.createIndex()
- 类型如下:单字段索引、复合索引、多key索引、文本索引等,每种类型的索引有不同的使用场合。
1. 单字段索引 (Single Field Index) 上建立的BId这个索引就是一个定型的例子。 2.复合索引 (Compound Index) 复合索引的场景其实用到比单字段索引要多,或者说是单子段索引的扩充,因为毕竟很少通过单个参数去获取大量数据。 3.多key索引 (Multikey Index) 应用针对数组,如果为一个数组类型的key建立了索引,实际上是给数组中的每一个元素建立了一条索引。
- 索引常用属性
1.唯一索引 (unique index):保证索引唯一性 2.TTL索引:可以针对某个时间字段,指定文档的过期时间 3.部分索引 (partial index): 只针对符合某个特定条件的文档建立索引 4.稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况
- MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
- MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许您从硬件故障和服务中断中恢复数据。
mongodb运行监控
- MongoDB中提供了mongostat 和 mongotop 两个命令来监控MongoDB的运行情况。
- mongostat
//mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当 //前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用 //mongostat来查看mongo的状态 D:\set up\mongodb\bin>mongostat
- mongotop
D:\set up\mongodb\bin>mongotop
常用插件之mongoose
对于nodejs开发者而言mongoose这款插件应该不陌生,我也是使用这款插件来入门的。
- Mongoose 是 MongoDB 的一个对象模型工具,它对 MongoDB 的常用方法进行了封装,让 node.js 操作 MongoDB 更加优雅简洁。
- 连接:一个简单的连接代码如下
// connection.js file const mongoose = require('mongoose'); const conn = mongoose.createConnection('mongodb://127.0.0.1:27017/demo')
- schema(数据结构):schema是mongoose里会用到的一种数据模式,可以理解为表结构的定义;每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力。简单一个schema如下
//定义一个简单的用户表 let mongoose = require('./db.js'), Schema = mongoose.Schema; let UserSchema = new Schema({ username : { type: String,default:'' }, //用户名 password: {type: String}, //密码 phone: {type: Number}, //手机号number类型 create_date : { type: Date} //用户创建日期 }); module.exports = mongoose.model('User',UserSchema);
- model(操作数据):定义好了Schema,接下就是生成Model。model是由schema生成的模型,可以对数据库的操作
leg user = new User({ username : 'demo', //用户名 password: 'abcd', //密码 phone: 12345678900, //年龄 create_date : new Date() }); user.save(function (err, res) {});
- 查询:在数据库使用我查询是我们使用频率最高的功能之一,下面简单介绍下mongoose中的查询功能
User.find({username: {gte: 21,lte: 65}} //常用操作符号 $or 或关系 $nor 或关系取反 $gt 大于 $gte 大于等于 $lt 小于 $lte 小于等于 $ne 不等于 $in 在多个值范围内 $nin 不在多个值范围内 $all 匹配数组中多个值 $regex 正则,用于模糊查询 $within 范围查询(基于LBS)
总结
作为一名程序员,我认为去了解多种数据库掌握一种数据库应该作为评估我们编程基本功的知识之一。本节主要是回顾自己所学所用中认为比较基础的mongodb知识,在下一节内容中将详细介绍mongodb的一些进阶使用和概念,如:复制和故障恢复 二进制数据存储 动态查询/完全索引/内部对象 模式自由