前言
对于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: ,
ordered:
}
)
//查询文档
db.collection.find({id:3})
//修改文档
db.collection.update({id:3},{test:'555'})
//删除文档
db.test.remove({id:4})
复制代码
操作符
(>) 大于 - $gt
(
(>=) 大于等于 - $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的一些进阶使用和概念,如:复制和故障恢复 二进制数据存储 动态查询/完全索引/内部对象 模式自由