一、什么事NoSQL?
NoSQL:Not Only SQL ,本质也是一种数据库的技术,相对于传统数据库技术,它不会遵循一些约束,比如:sql标准、ACID属性,表结构等。
Nosql优点
- 满足对数据库的高并发读写
- 对海量数据的高效存储和访问
- 对数据库高扩展性和高可用性
- 灵活的数据结构,满足数据结构不固定的场景
Nosql缺点 - 一般不支持事务
- 实现复杂SQL查询比较复杂
- 运维人员数据维护门槛较高
- 目前不是主流的数据库技术
1.1 NoSQL分类
db-engines排名
二、MongoDB入门
2.1 什么是MongoDB?
MongoDB:是一个数据库 ,高性能、无模式、文档性,目前nosql中最热门的数据库,开源产品,基于c++开发。是nosql数据库中功能最丰富,最像关系数据库的。
特性
l 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;
l 格式自由,数据格式不固定,生产环境下修改结构都可以不影响程序运行;
l 强大的查询语句,面向对象的查询语言,基本覆盖sql语言所有能力;
l 完整的索引支持,支持查询计划;
l 支持复制和自动故障转移;
l 支持二进制数据及大型对象(文件)的高效存储;
l 使用分片集群提升系统扩展性;
l 使用内存映射存储引擎,把磁盘的IO操作转换成为内存的操作;
2.2 什么需求场景下使用MongoDB?
并没有某个业务场景必须要使用 MongoDB才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题(包括学习、开发、运维等成本)
如果以下有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择MongoDB绝不会后悔!
2.3 MongoDB使用场景
MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例:
l 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
l 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
l 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
l 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
l 视频直播,使用 MongoDB 存储用户信息、礼物信息等
三、MONGODB的应用与开发
3.1 MongoDB的安装
3.1.1 官网下载安装包:
https://www.mongodb.com/try/download/community
下载:wget ‘https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-ubuntu2004-8.0.0.tgz’
解压:tar -zxvf mongodb-linux-aarch64-ubuntu2004-8.0.0.tgz
3.1.2 修改环境变量
vi /etc/profile
export MONGODB_HOME=/home/bing/app/mongodb8
export PATH=
P
A
T
H
:
{PATH}:
PATH:{MONGODB_HOME}/bin
source /etc/profile
创建mongodb存储目录
mkdir -p ~/mongodb-home/data
mkdir -p ~/mongodb-home/logs
3.1.3 启动
mongod --dbpath /home/parallels/mongodb-home/data --logpath /home/parallels/mongodb-home/logs/mongod.log --fork
//查看启动后的进程
ps -ef|grep mongodb
bing 6564 1 9 21:56 ? 00:00:01 mongod --dbpath /home/bing/app/mongodb-home/data --logpath /home/bing/app/mongodb-home/logs/mongod.log --fork
bing 6620 5839 0 21:56 pts/0 00:00:00 grep --color=auto mongodb
安装过程中遇到的问题:
mongod: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory
问题解决:
系统无法找到名为libcrypto.so.1.1的共享库文件。共享库文件是一些可被多个程序共享使用的代码和数据的集合,它们在系统中被动态加载
Ubuntu安装:sudo apt-get install libssl-dev
centos安装所有(安装完即可,下面两步Ubuntu执行) : yum install -y libcrypto.so.*
查找路径:find / -name libcrypto.so.1.1
更新库:sudo ldconfig /path //查找到的路径
3.1.4 MongoDB默认数据库
MongoDB默认会创建admin、config、local、test数据库。test库是一个默认的数据库,除了test库外admin、config、local库为系统库。admin库主要存储MongoDB的用户、角色等信息,config库主要存储分片集群基础信息,local库主要存储副本集的元数据。
3.2 MongoDB的基本概念
MongoDB 将数据记录存储为文档(具体来说是 BSON 文档),并将它的汇集在集合中。数据库存储一个或多个文档集合。
和关系数据库的对应关系如下:
MongoDB: 数据库 -> 集合 -> 文档
关系数据库:数据库 -> 表 -> 记录
3.3 MongoDB的增删改查
3.3.1.基本操作
选择和创建数据库的语法格式:
use 数据库名称
查看有权限查看的所有的数据库命令
show dbs
或
show databases
admin : 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合config : 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
集合的操作
新增:
db.createCollection(name)
隐式的方式
db.test_d.insert({u_id:1,goods_id:1});
集合的查询
show tables;
集合的命名规范:集合名不能是空字符串 “”。集合名不能含有 \0字符(空字符),这个字符表示集合名的结尾。集合名不能以 "system."开头,这是为系统集合保留的前缀。用户创建的集合名字不能含有保留字符。另外千万不要在名字里出现$。
文档的插入
db.test.insert("")
批量插入
db.comment.insertMany([{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"},{"id" : 110, "name" : "lijin", "createdatetime" : new Date(), "content" : "今天下雨,天气不好"}
]);
文档的基本查询
查询数据的语法格式如下:
db.collection.find(<query>, [projection])
文档的更新
db.collection.update(query, update, options)
文档的删除
db.collection.remove(条件)
db.collection.remove({_id:"1"})
db.comment.remove({}) 删除全部
3.3.2.复杂操作
统计查询
db.collection.count(query, options)
db.note.count(); --统计所有记录
db.note.count({name:"king"}); --统计name为king的记录条数
分页列表查询
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据
db.note.find().limit(3)
db.note.find().skip(3)
分页查询:需求:每页5个
db.note.find().skip(0).limit(5) //第一页
db.note.find().skip(5).limit(5) //第二页
db.note.find().skip(10).limit(5) //第三页
排序查询
db.集合名称.find().sort(排序方式) 1升序、-1降序
db.note.find().sort({name:-1,id:-1})
skip(), limit(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关
db.note.find().skip(0).limit(5).sort({name:-1,id:-1})
正则表达式
db.集合.find({字段:/正则表达式/}) 正则表达式是 js的语法
db.note.find({content:/下雨/}) content包含'下雨'的
db.note.find({name:/^k/}) name是k开头的
比较查询
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
db.note.find({id:{$gt:252}})
db.note.find({$and:[{id:{$gt:252}},{id:{$lt:256}}]})
条件连接查询
$and:[ { },{ },{ } ]
包含查询
db.note.find({id:{$in: [252,254]}})
3.4.索引-Index
索引(Index)是帮助MongoDB高效获取数据的数据结构,索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)
3.4.1 索引的管理
索引的创建
db.collection.createIndex(keys, options)
案例:对 note的content字段建立索引
db.note.createIndex({content:1}) --1是按照指定按升序创建索引 -1按降序来创建索引
查看索引
db.note.getIndexes(); --查看索引
复合索引:对name 和content 同时建立复合(Compound)索引:
db.note.createIndex({name:1,content:1})
索引的移除
db.collection.dropIndex(index) --移除指定索引
db.collection.dropIndexes() --移除所有索引
案例:删除note的的content索引
db.note.dropIndex({content:1})