NoSQL(NoSQL = Not Only SQL )
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理
结构化数据存储
数据库革命性运动
ACID规则
A (Atomicity) 原子性
C (Consistency) 一致性 一致性约束
I (Isolation) 独立性 并发的事务之间不会互相影响
D (Durability) 持久性
分布式系统(distributed system)
NoSQL用于超大规模数据的存储
1998年
CAP定理(CAP theorem)
布鲁尔定理(Brewer's theorem)
对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
C++语言 基于分布式文件存储的开源数据库系统
WEB应用
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成
MongoDB 工具
监控
网络和系统监控工具Munin Gangila
GUI
命令
"show dbs" 命令可以显示所有数据的列表
db 显示当前数据库对象或集合
use"命令,可以连接到一个指定的数据库
数据库
集合 MongoDB 文档组
文档 是一组键值(key-value)对(即 BSON)
元数据 dbname.system.*
MongoDB 数据类型
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
data
数据库管理系统 database management systemDBMS
数据库模型追踪实体、属性和关系
RDBMS、NOSQL
最重要的是NoSQL不使用SQL作为查询语言
1998年 2009年
非关系型、分布式、不提供ACID的数据库设计模式
Humongous(巨大
mongo 10.0.0.152/admin
db.version()
use test;
db db.getName()
show dbs;
show databases;
db.stats()
db.getMongo()
show collections;
db.getCollectionNames()
db.c.insert({name:'clsn'});
db.getCollectionNames()
db.c.find()
db.c.renameCollection("clsn")
db.a.drop()
for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
db.log.findOne() # 查看第1条记录
db.log.findOne() # 查看第1条记录
db.log.count() # 查询总的记录数
db.log.find({uid:1000}); # 查询UUID为1000的数据
db.log.remove({}) # 删除集合中所有记录
> db.log.stats() # 查看数据状态
> db.log.dataSize() # 集合中数据的原始大小
> db.log.totalIndexSize() # 集合中索引数据的原始大小
> db.log.totalSize() # 集合中索引+数据压缩存储之后的大小
> db.log.storageSize() # 集合中数据压缩存储的大小
> db.log.find({uid:1000}).pretty()
> db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root", db: "admin" } ]
}
)
show tables;
system.users # 用户存放位置
system.version
db.auth("root","root")
cat >>/application/mongodb/conf/mongod.conf<<-'EOF'
security:
authorization: enabled
EOF
# 命令行中进行登陆
mongo -uroot -proot admin
# 在数据库中进行登陆验证
db.auth("root","root")
db.dropUser("app")
1204
Humongous 开源数据库
二级索引,完整的查询系统以及严格一致性
敏捷性和可扩展性
可扩展性,高性能和高可用性
分布式文件存储的数据库
C++ WEB应用提供可扩展的高性能数据存储解决方案
介于关系数据库和非关系数据库之间的产品
面向集合”(Collection-Oriented) 数据集
基于分布式文件存储的NoSQL数据库
面向文档(document-oriented)的数据库
更好的扩展性
“行“(row) “文档”(document)
预定义模式(predefined schema) 键(key)和值(value)
T级数据 司空见惯
应该如何扩展数据库,分为纵向扩展(更强的机器)和横向扩展(数量)
偶数为“稳定版”(如:1.6.X,1.8.X)
奇数为“开发版”(如:1.7.X,1.9.X)
--dbpath指定数据存放地点为“db”文件夹
insert
find _id GUID全局唯一标识符
update
remove
SQL 数据库
Database Server mongod mysqld
Database Client mongo mysql
db.createCollection("people")
db.people.insertOne( {
user_id: "abc123",
age: 55,
status: "A"
} )
crud (Create)、检索(Retrieve)、更新(Update)和删除(Delete)
強大,靈活、且易於擴展的文件導向式(document-oriented)資料庫
彈性的Schema
橫向擴展 document的數據模型
不支援事務操作
占用比較多空間 預分配空間 欄位所占用的空間
Document
{
name : "mark".
age : 100 ,
title : 'Mark BIG BIG'
}
Key 區分大小寫 區分大小寫
Collection 一組Document
NoSQL = Not Only SQL RDBMS 1970 数据建模和应用程序编程 客户服务器编程
结构化数据存储 数据库革命性运动 2009
关系型数据库遵循ACID规则 - 高度组织化结构化数据
transaction
A (Atomicity) 原子性 要么全部做完,要么都不做
C (Consistency) 一致性 事务的运行不会改变数据库原本的一致性约束
I (Isolation) 独立性 并发的事务之间不会互相影响
D (Durability) 持久性
分布式系统是建立在网络之上的软件系统
内聚性和透明性 高内聚性代表低耦合性
可靠性(容错) 可扩展性:资源共享:灵活性:
更快的速度:更快的速度:更高的性能:
集中式计算机网络集群
超大规模数据的存储 不需要固定的模式 横向扩展
横向扩展 没有预定义的模式 1998年
Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS
CAP定理(CAP theorem) 布鲁尔定理(Brewer's theorem)
一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
BASE:Basically Available, Soft-state, Eventually Consistent
C++语言 基于分布式文件存储的开源数据库系统 高负载 WEB应用 高性能数据存储解决方案
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成
索引 查询表达式
MongoDB 工具 监控 GUI
MongoDB 下载
创建数据目录
数据存储目录 日志文件目录
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
tail -10f /var/log/mongodb/mongod.log
--dbpath 设置数据存放目录
--logpath 设置日志存放目录
--fork 在后台运行
文档、集合、数据库
"show dbs" 命令可以显示所有数据的列表。
执行 "db" 命令可以显示当前数据库对象或集合
运行"use"命令,可以连接到一个指定的数据库。
文档是一组键值(key-value)对(即 BSON)
MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型
文档(Document)
集合 文档组
元数据
数据库的信息是存储在集合中
dbname.system.*
MongoDB 数据类型
BSON 字符串都是 UTF-8 编码。
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb://localhost
mongodb://admin:123456@localhost/
mongodb://fred:foobar@localhost/baz
创建数据库 use DATABASE_NAME
删除数据库 db.dropDatabase()
删除集合 db.collection.drop()
创建集合 db.createCollection(name, options)
查看已有集合 show collections 或 show tables
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
删除集合 db.collection.drop()
插入文档
db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document) # 该方法新版本中已废弃
db.collection.insertOne() 或 db.collection.replaceOne()
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
db.col.find().pretty()
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
删除文档
db.collection.remove(
<query>,
<justOne>
)
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
db.collection.find(query, projection)
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
db.col.find({likes : {$gt : 100}})
$type 操作符
db.COLLECTION_NAME.find().limit(NUMBER)
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
>db.COLLECTION_NAME.find().sort({KEY:1})
>db.collection.createIndex(keys, options)
>db.col.createIndex({"title":1,"description":-1})
1、查看集合索引
db.col.getIndexes()
2、查看集合索引大小
db.col.totalIndexSize()
3、删除集合所有索引
db.col.dropIndexes()
4、删除集合指定索引
db.col.dropIndex("索引名称")
MongoDB 聚合
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
MongoDB 复制(副本集)
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
rs.initiate() 启动一个新的副本集
rs.conf()来查看副本集的配置
查看副本集姿态使用 rs.status() 命令
rs.add()方法来添加副本集的成员
rs.add(HOST_NAME:PORT)
db.isMaster()
分片技术
mongodump
mongodump -h dbhost -d dbname -o dbdirectory
mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
mongostat 和 mongotop 两个命令来监控MongoDB的运行情况
1:1 (1对1)
1: N (1对多)
N: 1 (多对1)
N: N (多对多)
嵌入式关系
引用式关系
MongoDB 查询文档使用 find() 方法
find().pretty()方法 查询出来的数据在命令行中更加美观的显示,不至于太紧凑
db.collection.find(query, projection)
AND 条件
db.col.find({key1:value1, key2:value2}).pretty()
OR 条件
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
更为灵活的文档来作为数据模型用来取代RDBMS中的行
大数据领域
数据库表中的字段名称、字段类型、进行规定
数据的完整性
MongoDB不支持事务
database ==> 数据库;
collection ==> 集合(表);
document ==> 文档(数据记录);
field ==> 域(数据字段);
index ==> 索引;
primary key ==> 主键,MongoDB自动将_id字段设置为主键。
创建数据库
use databasename
db.getName()
show dbs;
db
db.mongotest.insert({"id":10001,"name":"tianyongtao","regtime":Date()})
db.dropDatabase()
db.createCollection("userinfo")
show collections
db.recharge.drop()
db.collection.insertOne():向指定集合中插入一条文档数据
db.collection.insertMany():向指定集合中插入多条文档数据
更新
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
>db.COLLECTION_NAME.find().sort({KEY:1})
MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统
分布式文件存储的NoSQL数据库
可扩展的高性能数据存储解决方案
模式自由
面向集合的存储:适合存储 JSON风格文件的形式
基于分布式文件存储的数据库
WEB 应用提供可扩展的高性能数据存储解决方案
介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"
关系数据库管理系统(RDBMS)
数据建模和应用程序编程更加简单
关系模型是非常适合于客户服务器编程
结构化数据存储
ACID规则
Linux 平台依赖包
yum install libcurl openssl
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz # 下载
tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz # 解压
mv mongodb-src-r4.2.8 /usr/local/mongodb4 # 将解压包拷贝到指定目录
export PATH=/usr/local/mongodb4/bin:$PATH
tar -zxvf mongodb-linux-x86_64-rhel62-4.4.2.tgz
rpm -qa | grep openssl
cd /usr/lib64
创建仓库文件:
vi /etc/yum.repos.d/mongodb-org-3.4.repo
https://www.cnblogs.com/layezi/p/7290082.html
MongoDB的单个实例可以容纳多个独立的数据库,
每一个都有自己的集合和权限,
不同的数据库也放置在不同的文件中
use local
db
mongodb://fred:foobar@localhost
mongodb://fred:foobar@localhost/baz
replica pair
use DATABASE_NAME
db.runoob.insert({"name":"菜鸟教程"})
db.dropDatabase()
db.dropDatabase()
db.createCollection(name, options)
启动配置参数
mongo server_ip:port/dbname -u user -p password
db.collection.insert(document)
use database_name
db
show dbs
db.collection.insert(document)
db.user.find().pretty()
db.user.remove({})
db.collection.find(query, projection)
db.user.find({"addr":"ShenZhen","age":25},{"_id":0}).pretty()
范围操作符
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
db.user.find({$or:[{"addr":"ShenZhen"},{"age":{$gte:30}}]}).pretty()
db.collection.find().sort({KEY:1})
db.collection.aggregate(AGGREGATE_OPERATION)
db.user.aggregate([{$group:{_id:{userAddr:'$addr'},totalCount:{$sum:1}}}])
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
db.user.update({'name':'chenyurong'},{$set:{'age':25}})
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
查看当前数据库:db
查看所有数据库:show dbs
查看当前数据库所有集合(表格):show collections
可扩展的高性能数据存储解决方案
WEB 应用
分布式文件存储的数据库
Robo3T数据库可视化工具
db.getCollection('test_data_1').insertOne(
{
"name":8888,
"address":"changsha"
}
)
db.getCollection('test_data_1').insertMany([
{
"name":"名字1",
},
{
"name":"名字2",
},
{
"address":"湖南"
},
]
)
db.getCollection('test_data_1').find({})
db.getCollection('test_data_1').find({"字段1":"固定值1","字段2":"固定值2"})
db.getCollection('test_data_1').find(
{
"字段1":{"操作符1":边界1,"操作符2":边界2},
"字段2":{"操作符1":边界1,"操作符2":边界2}
}
)
db.getCollection('test_data_1').find(用于过滤的条件,用于限定的条件)
db.getCollection('test_data_1').find({}).count()
db.getCollection('test_data_1').find({}).limit(限制返回的数量)
db.getCollection('test_data_1').find({}).sort({"字段名":-1或者1})
db.getCollection('test_data_1').updateMany(
// 下面是查询条件
{
"字段名1":"查找条件1","字段名2":"查找条件2"
},
// 进行修改
{
"$set":{"字段名":"新的数据","字段名":"新的数据"}
}
)
db.getCollection('test_data_1').deleteMany(
// 删除的条件
{
"字段名1":"值","字段名2":"值2"
}
)
db.getCollection('test_data_1').distinct(去重的字段名,去重的条件)