本篇文章会介绍Nosql和关系型数据库之间的区别,了解NoSQL ,NoSQL数据库与关系型数 据库有什么不一样。对比关系型数据库理解 MongoDB,MongoDB安装及JAVA客户端使用 ,以及spring对Mongodb的支持。
最开始因为简单 快速 使用nosql,到现在的sql,不断的进化, 然后发觉sql并不能满足时,有兴起了nosql数据库
为了性能 一直在努力,一直在寻找着解决方案。
对于不同的场景进行选择不同nosql数据库,包括我在项目中 进行大数据量数据分析,采用hbase是非常使用的,当然还有现在比较流行的clickhouse等。
如果 数据库表中 有大量的null值,在关系型数据库中非常占资源的,而如果采用列式存储方式换一个角度 ,没有就不存,对于结构要求不是很严格 采用列式存储是非常有效的。功能是有限的,例如id去查不方便去查。
功能不能像传统型数据库一样做到sql支持完整。
对于文档存储方式,数据结构要求不严,表的结构可以变化,查询性能要求不高。实现的方式 大部分存储方式是json格式,包括es 和 mongodb都是的, 都是自定义的一套操作语法。
mapreduce、全文检索实现方式不一样的,这都是es和mongdb不同的地方。
包括上面的 利用图结构相关算法的数据库 这个一般很少使用的数据库。在地图这些应该用到很多。
针对这些的排名情况。
DB-Engines Ranking - popularity ranking of database management systems
最高的还是oracle 我觉得得益于政府 大企业的使用, 其实 SQlite数据库来说,我觉得还是得益于android手机 确实还是比较火的。
包括其他的一些排行榜数据库
这在对比起来,因为方向不一样,所以 各自的特点不一样,包括 强一致性 和弱一致性,都是 为了提高某一部分的能力提高,因此才用的结构。 一级 二维和多维表 json格式等。提高存储,以及大数据量的问题,并且对于事务这些问题,因此都会分开 nosql 关系型数据库的概念。
这些一般关系型数据库的优点 其实就是nosql数据库的缺点,反之, 也是得益于存储结构导致的。
主要和js语言很像,所以书写时也比较简单了。而且在互联网公司中应用是非常广泛的。
这都是为什么要使用mongdb 情况。
都是得益于mongodb的自带的优缺点导致的。
很多文档进行逻辑分组。
在bson里面有内嵌文档 可以相当于类似面向对象类型。
数据类型
Bson是JSON文档的二进制表示形式,它包含比JSON更多的数据类型。
MongoDB中,一个BSON文档最大大小为16M,文档嵌套的级别不超过100
在mongodb中可以使用其他类型来存大对象 gridFS用来解除大块文件限制的问题
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz
tar -vzxf mongodb-linux-x86_64-rhel70-4.2.1.tgz
mv mongodb-linux-x86_64-rhel70-4.2.1 /usr/local/mongodb
cd /usr/local/mongodb
mkdir -p /usr/local/mongodb/logs /usr/local/mongodb/data # 创建目录备用
vim /usr/local/mongodb/logs/mongodb.log # 创建一个空日志文件即可
vim /usr/local/mongodb/bin/mongodb.conf # 创建MongoDB的配置文件
# MongoDB的配置文件,mongod.conf
# 配置文件全部配置参考下面网址:
# http://docs.mongodb.org/manual/reference/configuration-options/
# 写入日志数据的位置
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb/logs/mongodb.log
# 存储数据的地点和方法
storage:
dbPath: /usr/local/mongodb/data
journal: enabled: true
# engine:
# wiredTiger:
# 进程如何运行
processManagement:
fork: true # 是否启用子进程在后台运行
pidFilePath: /usr/local/mongodb/mongod.pid # pidfile的位置
timeZoneInfo: /usr/share/zoneinfo
# 网络配置
net:
port: 27017 # 默认端口号
#bindIp: 127.0.0.1 # 设定ip地址白名单,此处我们注释掉为了方便学习
# 方便学习改为true,生产环境则使用白名单
bindIpAll: true # 是否允许所有的ip地址访问,默认是false
cd /usr/local/mongodb
sudo bin/mongod -f bin/mongodb.conf
# 通过制定配置文件来启动
# 通过kill命令关闭进程来关闭mongodb
sudo service mongod start # 启动
sudo service mongod stop # 停止
sudo service mongod restart # 重启
sudo tail -f /var/log/mongodb/mongod.log
sudo /usr/bin/mongod --help
# 连接本地默认端口
sudo /usr/bin/mongo
# 连接远程
sudo /usr/bin/mongo -u -p --host --port 28015
sudo /usr/bin/mongods --help
./mongo
db # 显示当前数据库
use dataBaseName # 如果dataBaseName不存在,在插入数据时将会创建数据库
show dbs # 显示当前实例中的数据库
db.dropDatabase() # 删除当前选择的库
db.createCollection("runoob") # 显式的创建runoob集合
show tables # 显示当前数据库中的集合信息
show collections
db.runoob.drop() # 删除runoob集合
db.collection.insertOne()
#插入单个文档
db.collection.insertMany() #插入多个文档
db.collection.insert()
#插入单条或多个文档
db.collection.insert(
,
{
writeConcern: ,
ordered:
} )
在加上本身的内嵌文档中数据查询 in all 满足一个就行,全部满足
db.collection.find(query, projection)
这都是逻辑符,这个是通用的。
这在使用中可以用得到。
// 分页查询,并排序
// offset limit
db.inventory.find().skip(2).limit(2).sort({qty:1});
db.inventory.find().sort({qty:1});
// 单用途聚合操作
db.inventory.distinct("status");
// 要避免不通过查询器,直接使用count方法,会导致近似计数。
db.inventory.find({ status: "A" }).count(); // 4.0弃用
// 基于count方法而来,估算集合中的文档数
db.inventory.estimatedDocumentCount({});
// 通过对数据进行统计的,返回准确的计数,通过聚合计算而来
db.inventory.countDocuments({ status: "A" })
// 统计集合中状态为A的文档数
db.inventory.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: null, totalStatusADoc: { $sum: 1 } } }
])
计算 和估算操作,map-reduce.进行聚合查询。
统计可用物品这些。
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
这都是更新操作。
更新单个文档,会更新第一个匹配到的文档
// UPDATE inventory SET size.uom='cm', status='P', lastModified=now() WHERE item = "paper"
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
批量更新
// UPDATE inventory SET size.uom='in', status='P', lastModified=now() WHERE qty < 50
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
把文档做掉进行更新。
直接隐式转换,
可以支持任意修改已存在字段的数据类型,直接转换数字
往tags数组中增加元素,如果tags字段不存在则会新增该字段,如果值有重复就不处理
数组中添加数组元素,并不是添加多个值
通过$each,往数组中添加多个值
更新所有记录,删除tags数组的red、big元素
db.inventory.find({ tags: { $in: ["red", "big"] } })
db.inventory.update(
{ },
{ $pull: { tags: { $in: [ "red", "big" ] }} },
{ multi: true }
)
删除length数组中包含50/90的元素
// 删除length数组中包含50/90的元素
db.inventory.update( { item: "apple" }, { $pullAll: { length: [ 150, 390 ] } } )
// 从前弹出一个元素,类似队列的pop api
db.inventory.update( { item:"mobile"}, { $pop: { scores: -1 } } )
// 从后弹出两个元素
db.inventory.update( { item:"mobile"}, { $pop: { scores: 2 } } )