MongoDB和Redis都是NoSQL数据库,采用结构型数据存储,而MySQL、oracle等则属于传统的关系型数据库。注意NoSQL不是没有SQL,而是Not only SQL。
概念
- NoSQL数据库与关系型数据库的优缺点
关系型数据库
优点:以完善的关系代数理论为基础,有严格的标准,支持事务ACID四性,借助索引机制可以实现高效的查询。
缺点:可扩展性差,无法较好地支持海量数据存储,数据模型过于死板,事务机制影响了系统的整体性能,全文搜索功能较弱。
NoSQL数据库
优点:数据之间无关系,易扩展。有非常高的读写性能,支持大量数据,性能高。有灵活的数据模型,无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
缺点:复杂查询性能不高,一般都不能实现事务的强一致性。
- redis与mongoDB的区别
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据会优先存于内存,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
需要注意的是Redis 和mongoDB特别消耗内存,一般不建议将它们和别的服务部署在同一台服务器上。
Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
当物理内存够用的时候,性能,redis>mongodb>mysql
数据量,mysql>mongodb>redis
scp -r webdemo@192.168.1.34:/mnt3/jeng/sofa_img ./
关系型数据库遵循ACID规则
事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:
1、A (Atomicity) 原子性
2、C (Consistency) 一致性
3、I (Isolation) 独立性
4、D (Durability) 持久性
为什么需要NoSQL?
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL 数据库的发展却能很好的处理这些大的数据。
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。NoSql,全称是 Not Only Sql,指的是非关系型的数据库。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
- MongoDB是一个独立的服务器;
- 它是基于文档的,而不是基于表格的;
- 它是非结构化的;
- 它具有强大的主流开发语言支持,如C#、C++、Java、PHP、Perl、Python、Ruby。
- 可扩展性
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 支持完全索引,包含内部对象。
- 面向集合存储,易存储对象类型的数据。
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
现在已经有很多公司使用了 NoSQL:
Google
Facebook
Mozilla
Adobe
Foursquare
相对于传统的关系型数据库,优缺点表现如下。
优点:
- 面向文档存储(类JSON数据模式简单而强大)
- 动态查询
- 快速,就地更新
- 高效存储二进制大对象 (比如照片和视频)
缺点:
- 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持)
- MongoDB占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了)
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
Mongo查询可以分为2种:
- 普通查询,类似于Sql中的 select where
- 聚合查询,类似于Sql中的 group by
MongoDB
普通查询
- 查询所有的结果
1
2
3
4
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find({});
|
对应的sql 语句
1
|
select * from Multi_Quality_all
|
- 条件查询
1
2
3
4
5
6
7
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find(
{
"quality" : "Good"
}
);
|
返回在 InteriorDesign
数据库 Multi_Quality_all
中,满足 字段 quality
是Good 的条件查询。
更多的例子
1
|
db.getCollection("Product").find({"vendor": "kazigoods"}).limit(5)
|
AND 条件查询
实现类似 SQL 语句中 AND 的操作。 在mongodb 是在find 函数中指定多个字段,满足所需要的条件。(表示并集关系)
1
2
3
4
5
6
7
8
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find(
{
"quality" : "Good",
"source" : "Room_Type"
}
);
|
OR 条件查询
(从代码量上看,相比于SQL,mongodb实现 OR 查询操作是比较多的。 注意如果使用关键字,那么是需要加上 {}
进行嵌套处理的)。 mongodb中先将逻辑运算符写到前面,然后是不同的子条件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find(
{
"$or" : [
{
"process_count" : {
"$lt" : 1.0
}
},
{
"source" : "Room_Type"
}
]
}
);
|
对应的sql 语句
1
|
select * from Multi_Quality_all where process_count <1 or source ="Room_Type"
|
上面的查询都是返回全部字段,当然也是可以返回部分字段的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find(
{
"$or" : [
{
"process_count" : {
"$lt" : 1.0
}
},
{
"source" : "Room_Type"
}
]
},
{
"_id" : 1.0,
"path" : 1.0,
"quality" : 1.0,
"source" : 1.0
}
);
|
基本的语法形式
显示字段时候 设置为1, 不显示字段的时候设置为0.
1
2
3
4
|
db.getCollection("Multi_Quality_all").find(
{},
{user_id :1, _id : 0}
)
|
条件查询不等于
设置字段 status 不为 ‘A’; 同理大于号, $gt
, 小于号, $lte
1
2
3
|
db.getCollection("Multi_Quality_all").find(
{ status : {$ne : "A"}}
)
|
条件模糊查询
1
2
3
|
db.getCollection("Multi_Quality_all").find(
{ user_id : /bc/ }
)
|
或者写成
1
2
3
|
db.getCollection("Multi_Quality_all").find(
{user_id : { $regex : /bc/}}
)
|
类别条件查询 like
1
2
|
select * from Multi_Quality_all
where user_id like "%bc%"
|
(有点类似正则表达式?)
再来一个例子
1
2
3
4
5
|
db.getCollection("Multi_Quality_all").find( { user_id: /^bc/ } )
# 对应的sql 语句
SELECT *
FROM people
WHERE user_id like "bc%"
|
排序
注意在设置 sort() 属性时候,选定的字段需要设置为1, 全部都是面向文档(json的格式)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// Requires official MongoShell 3.6+
use InteriorDesign;
db.getCollection("Multi_Quality_all").find(
{
"$or" : [
{
"process_count" : {
"$lt" : 1.0
}
},
{
"source" : "Room_Type"
}
]
},
{
"_id" : 1.0,
"path" : 1.0,
"quality" : 1.0,
"source" : 1.0
}
).sort(
{
"_id" : 1.0
}
);
|
统计数量
在代码中还是可以使用的。
1
|
db.getCollection("Multi_Quality_all").find().count()
|
条件统计
1
2
3
4
5
6
7
8
9
|
db.getCollection("Multi_Quality_all").find(
{age : {$gt : 30}}
).count()
# 或者使用
db.getCollection("Multi_Quality_all").count(
{age : {$ gt : 30}}
)
|
去掉重复的数据 distinct
按照某个字段 _id
进行去重
1
|
db.getCollection("Multi_Quality_all").distinct("_id")
|
限制数量
1
2
3
4
5
|
db.getCollection("Multi_Quality_all").find().limit(1)
或者
db.getCollection("Multi_Quality_all").findOne() # 查询一条数据
db.getCollection("Multi_Quality_all").find().skip(2) # 指定从第2 条开始查询
db.getCollection("Multi_Quality_all").find().count() # 查看数量
|
mongodb 中find() 的各种查询
1
2
3
4
5
|
$lt, $lte, $gt, $gte, $ne 条件句 # 分别对应的是 <, <=, >, >=, !=
$in, $all, $nin # 后面跟的是数组
$in #表示满足这个数组之内的值之一都能查到
$nin # 不在这个数组之内的值都能查到
$all # 表示满足数组内的所有值
|
对于正则表达式的支持
1
2
3
|
db.getCollection("Product").find({"name": "/^hello/"}) # 查询一hello 开头的数据
db.getCollection("Product").find({"name": "/hello/"}) # 查询包含 hello 的数据
db.getCollection("Product").find({"name": "/^hello/i"}) # 查询一hello 开头的数据,不区分大小写
|
排序
1
|
db.getCollection("Product").find().sort({"price": 1}).limit(10) #按照 price增序排序
|
尝试过的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 显示所有的db
//show dbs;
// 使用 Scrape 数据库
use Scrape;
// 显示所有的collection 表格
//show collections;
//对一个表格进行查询
//db.getCollection("Product").find().limit(10)
//db.getCollection("Product").find({"vendor": "kazigoods", "url":"https://kazigoods.com/collections/all/products/large-arctic-blue-tumaini-bowl-sss19"}).limit(10)
//db.getCollection("Sku").find().limit(10)
//db.getCollection("Sku").find({"price": {$gt: 13800}}).limit(5)
//db.getCollection("Sku").find({"price": {$gt: 13800, $lt: 30000}}).limit(5)
//db.getCollection("Sku").find({"price" : {$nin :[20000, 18800]}}).limit(5)
//db.getCollection("Sku").find({"Price" : {$in :[20000, 18800]}}).limit(5) // 这个查询比较费劲,因为 in的条件比较难找
//db.getCollection("Sku").find({})
db.getCollection("Sku").find({"sku" : "/^FB/"} ).limit(5) // 连接国外的 mongodb,一旦进行某种运算,那么是相当耗时的
|
参考的链接:
MongoDB常用命令笔记
聚合查询
普通查询使用 find
函数即可,但是聚合查询使用另外一个函数aggregate
。两者的区别在于是否使用聚合函数。
这个是直接使用 pandas 进行数据分析,不使用 类似 sql语句了。
MongoDB查询总结
MongoDB 查询文档
MongoDB 教程
Redis
应用场景
- 缓存
当某些系统接口比较慢的时候,我们可以把一些数据放在 Redis 中缓存起来,下次取数据就可以不进行耗时的操作,直接从缓存中取数据,这个是提升性能的方式之一。
MYSQL数据查询常用的命令
mysql ->库 -> 表 -> 数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#use flair;
#SELECT * from t_flair_address LIMIT 5;
#SHOW TABLES;
#DESC t_flair_file;
#show COLUMNS form t_flair_case;
#use Image;
#show TABLEs;
#DESC ImageColor3;
#SELECT * form ImageColor3 where img_id
USE Image2;
#SELECT * from ImageColor limit 5;
#SELECT * FROM ImageInfo limit 5;
#SELECT * from ImageInfo2 limit 5;
#SELECT * from VectorLabels LIMIT 5;
# 下划线_ 只能匹配单个字符而不是多个字符,不要过度使用通配符
# select * from ImageColor where img_color1 like '%Grey%' limit 5;
# select * from ImageColor where img_color1 ='Red' limit 5;
# select img_id FROM Image_Color WHERE img_id is not null limit 5;
#SELECT * from ImageColor where img_color1 ='Red' and img_color2 ='Pink'
#SELECT * from ImageColor where img_color1 ='Red' or img_color2 ='Pink' limit 5;
select * from ImageColor where img_color1 in ('Red', 'Pink', 'Black') and img_color3='Brown' limit 5;
|
MYSQL中的关键字是limit, sql server的关键字是top。limit 更加类似一种分页功能,
待整理
google 搜索 “robo 3t mongodb 查询命令教程”, 分别学习一下 python mongodb相关的查询命令
和 robo 3t mongodb的查询命令
。