NoSQL
not only sql
1.KV/键值存储数据库
使用到一个哈希表,表中由一个特定的键和一个指针指向特定数据
优点:简单、易部署
缺点:对部分值查询或更新时效率低下
如:Redis、OracleBDB、Tokyo Cabinet/Tyrant、Voldemort
2.列存储数据库
应对分布式存储的海量数据,键存在,但指向了多个列
如:HBase、Riak、Cassandra
3.文档型数据库
类似于键值存储,可看作键值数据库的升级版,允许之间嵌套键值,查询效率更高(多值查询,单值查询依然是键值数据库查询最高)
如:MongoDB、SequoiaDB(国内)、CouchDB
4.图形数据库
使用灵活的图形(Graph)模型,能够扩展到多个服务器上(易扩展)
如:InfoGird、Neo4J、Infinite Graph
MongoDB
MongoDB是一个基于分布式文件存储的数据库管理系统(DBMS),由C++编写,旨在为web应用提供可扩展的高性能数据存储解决方案
MongoDB一般不用于缓存,是非关系型数据库中功能最丰富、最像关系数据库的,支持的数据结构类似于json的bson(落地以字节存储)格式
最大的特定是支持的查询语句非常强大,类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
json不能描述双向关联数据
关系型:拥有外键+关系描述
MongoDB对比RDBMS
1.属于概念区别
RDBMS MongoDB
数据库: database database
数据库表/集合: table collection
数据记录行/文档: row document
数据字段/域: column field
索引: index index
表连接: table joins null
主键: primary key primary key(自动将_id设置为主键)
2.存储数据对比
表字段
对象,一个对象一行
3.术语
mongoDB的客户端有mongo、mongos(访问集群分片)
MongoDB数据类型
String
Integer(32-4、64-8)
Double
Boolen
Array:{a:[]}
Object:{b:{}}
MongoDB的安装
默认端口号27017
1.下载MongoDB
2.上传tgz,解压并移动到目录/usr/local/mongodb/
# 解压
tar -xvf mongodb-linux-x86_64-4.0.9.tgz
# 移动
mv mv mongodb-linux-x86_64-4.0.9 /usr/local/mongodb/
3.创建数据库目录
# 进入mongodb目录
cd /usr/local/mongodb
# 创建数据库目录
mkdir -p data/db
4.启动
# 进入mongodb目录
cd /usr/local/mongodb/
# 前置启动
./mongod --dbpath /usr/local/mongodb/data/db/
# mongodb默认端口27017
# 退出使用Ctrl+C
# 进入mongodb目录
cd /usr/local/mongodb
# 创建log目录
mkdir log
# 进入log目录
cd log
# 创建mongodb.log文件
touch mongodb.log
# 进入mongodb的bin目录
cd /usr/local/mongodb/bin/
# 后置启动
./mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/log/mongodb.log --fork
# 查看日志信息
more /logs/mongodb.log
5.通过配置文件启动
# 进入mongodb目录
cd /usr/local/mongodb
# 创建etc目录
mkdir etc
# 进入etc目录
cd etc
# 创建mongodb.conf文件
vim mongodb.conf
# 添加内容
# fork=true
# port=27017
# dbpath=/usr/local/mongobd/data/db/
# logpath=/usr/local/mongodb/logs/mongodb.log
# 启动
./mongod --config /usr/local/mongodb/etc/mongodb.conf
# 进入系统
./mongo
6.配置环境变量
# 编辑配置文件
vim /etc/profile
# 添加mongodb的bin目录路径
# export PATH=/usr/local/mongodb/bin:$PATH
# 保存后重新加载
. /etc/profile
# 验证
# 进入根目录
cd /
# 测试
mongod --help
# 有显示内容则配置成功
7.关闭
# 前置启动情况下使用Ctrl+C退出
# 后置启动情况下
# kill+进程号退出(不推荐)
# 安全关闭(优雅关闭),保存数据安全
mongod --shutdown --dbpath /usr/local/mongodb/data/db/
# 函数关闭,进入mongodb后使用
db.shutdownServer();
db.runCommand("shutdwon");
用户操作
3.9+用户操作必须在admin库下操作
3.9-用户操作可以在admin或所属库操作
# 配置好环境变量后进入mongodb系统
mongo
# 查询所有数据库
show dbs;
show databases;
# mongodb默认自带admin、config、local库
# 使用数据库(没有则创建一个数据库)
# 才创建的空数据库,使用show dbs/databases将无法查看到(show显示的是磁盘上的库,此时新创建的空库还在内存中)
use test;
# 删除数据库(必须先进入该数据库才能删除)
db.dropDatabase();
# 新增数据
db.test.insert({"name":"khue"});
# 查看所有集合
show collections;
# 查看集合中的所有数据
db.test.find();
# 查询用户
show users;
db.system.users.find();
# 进入admin库中创建超级用户
use admin;
db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]});
# 创建超级用户后,关闭系统
db.shutdownServer();
quit();
# 在配置文件中新增验证权限
vim /usr/local/mongodb/etc/mongodb.conf
# 新增
# auth=true
# 保存后关闭
# 重新开启mongodb
mongod --config /usr/local/mongodb/etc/mongodb.conf
# 进入系统
mongo
# 进入admin库
use admin
# 查看所有用户
db.system.users.find();
# 将提示无权限
# 用户登录
db.auth("root","root");
# 返回1为登录成功
# 再次查询即可
db.system.users.find();
#修改用户
db.updateUser("username",{"updatename":"new value"});
db.changeUserPWD("username","new password");
# 删除用户
```sql
db.dropUser("username");
集合操作
show collections;
show tables;
# 自动新增
db.coll1.insert({"name":"khue"});
# 手动新增
db.createCollection("coll2");
# 查看集合特征
db.coll1.stats();
# 创建集合
db.createCollection("coll3",{"capped":true,"size":10000,"max":100});
# 删除
db.coll3.drop();
文档操作
# 新增
db.coll2.insert({'num':1,'remark':first});
db.coll2.insert([{'num':2,'remark':second},{'num':3,'remark':third}]);
db.coll2.save({'num':4});
db.coll2.save([{'num':5},{'num':6}]);
# 3.2之后推荐使用
db.coll2.insertOne({'num':7});
db.coll2.insertMany([{'num':8},{'num':9}]);
# 定义变量
rowData={'num':10,'remark':'test'};
rowDatas=([{'num':11},{'num':12}]);
db.coll2.insertOne(rowData);
db.coll2.insert(rowDatas);
# 更新
# 覆盖更新-只覆盖文档顺序符合的第一条
db.coll2.update({'num':12},{'num':13});
# 主键覆盖,不存在就新增
db.coll2.save({'_id':ObjectId("xxxxx"),'num':12});
# 部分更新
db.coll2.update({'num':1},{'$set':{'num':2}});
db.coll2.update({'num':2},{'$set':{'remark':2}},false,true);
# 表达式更新(9个)
# 数值字段运算
db.coll1.update('name':'jack'},{'$inc':{'age':1}});
# 修改字段
db.coll1.update('name':'jack'},{'$set':{'age':25}});
# 删除字段,可用任意占位 一般使用1
db.coll1.update('name':'jack'},{'$unset':{'age':1}});
# 字段追加数据(不存在就新增,该字段必须为数组),不能批量追加
db.coll1.update('name':'jack'},{'$push':{'hobby':'play'}});
# 数组追加值,不存在才追加,不能批量追加
db.coll1.update('name':'jack'},{'$addToSet':{'hobby':'eat'}});
# 删除数组内的第一个值(-1)最后一个值(1)
db.coll1.update('name':'jack'},{'$pop':{'hobby':-1}});
# 删除数组中等值数据(多个等值数据同时删除)
db.coll1.update('name':'jack'},{'$pull':{'hobby':'eat'}});
# 批量删除数组等值数据
db.coll1.update('name':'jack'},{'$pullAll':{'hobby':['eat','paly']}});
# 字段重命名(先删除,后再新增,字段顺序会变化)
db.coll1.update('name':'jack'},{'$rename':{'hobby':'hobbys'}});
# 删除
# 不给条件,删除第一条数据
db.coll2.deleteOne();
# 删除小于等于5的数据
db.coll2.deleteMany({'num':{'$lte':5}});
# 数据还在,需要手动释放空间
db.coll2.remove(num:9);
db.coll2.remove(num:{$lte:9});
db.repariDatabase();
# 删除所有
db.coll2.remove({});
# 查询
# 查询自然序列第一条数据
db.coll1.findOne();
db.coll1.findOne({'name':'zhangsan'});
db.coll1.find();
db.coll1.find('age':{'$lt':20})
# 投影 id默认出现,非主键字段不可互斥(name:1,age:0),主键为1与非主键0不可互斥(name:0,_id:1),主键为1与非主键0可以互斥
# 常用{_id:0,xx:1}、{xx:0}
db.coll1.findOne({},{'name':1,'age':1});
# 格式化显示 findOne()不能连用pretty(),因为findOne自带格式化结果
db.coll1.find().pretty();
字符串也可以比较大小,但使用的是Unicode编码顺序比较
日期:new ISODate(“yyyy-MM-ddTHH:mm:ss:SSSZ”)
多条件逻辑运算符
db.coll1.find({name:zhangsan,age:{$lt:21}})
db.coll1.find({$or:[{name:zhangsan},{age:{$lt:21}}]});
db.coll1.find({age:20,$or:[{name:zhangsan},{name:zhaoliu}]});
$type操作符
# 类型查询
db.cool1.find(age:{$type:double});
# 正则查询
# z开头
db.coll1.find(name:/^z/);
db.coll1.find(name:{$reges:/^z})
# n结尾
db.coll1.find(name:/n$/);
# 包含a
db.coll1.find(name:/a/);
# 包含a,忽略大小写
db.coll1.find(name:/a/i);
db.coll1.find(name:{$reges:/^z,#options:i})
# 分页
db.coll1.find().limit(1);
db.coll1.find().limit(1).skip(2);
db.coll1.find().skip(2).limit(1);
# 排序 1升序 -1降序
db.coll1.find().sort({age:1})
# 复合排序 先按age排序,再按name排序
db.coll1.find().sort({age:1,name:-1})
来源:CSDN
作者:Khue
链接:https://blog.csdn.net/weixin_43647393/article/details/103592301