MongoDB和Redis都是NoSQL数据库,采用结构型数据存储,而MySQL、oracle等则属于传统的关系型数据库。注意NoSQL不是没有SQL,而是Not only SQL。

概念

  1. NoSQL数据库与关系型数据库的优缺点

关系型数据库

优点:以完善的关系代数理论为基础,有严格的标准,支持事务ACID四性,借助索引机制可以实现高效的查询。

缺点:可扩展性差,无法较好地支持海量数据存储,数据模型过于死板,事务机制影响了系统的整体性能,全文搜索功能较弱。

NoSQL数据库

优点:数据之间无关系,易扩展。有非常高的读写性能,支持大量数据,性能高。有灵活的数据模型,无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。

缺点:复杂查询性能不高,一般都不能实现事务的强一致性。

  1. 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. 查询所有的结果
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. 条件查询
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

应用场景

  1. 缓存

当某些系统接口比较慢的时候,我们可以把一些数据放在 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的查询命令