NoSQL

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是 SQL”。

NoSQL 是指非关系型数据库,用于超大规模的数据管理,这类数据不需要存储不需要固定的格式,无需多与操作就能横向扩展

MongoDB

介绍

MongoDB 属于 NoSQL 数据库的一种,是 C++编写的基于分布式文件存储的开源数据库系统

类型 部分代表 特点
列存储 Hbase

Cassandra
Hypertable | 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的 IO 优势。 |
| 文档存储 | MongoDB
CouchDB | 文档存储一般用类似 json 的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。 |
| key-value 存储 | Tokyo Cabinet / Tyrant
Berkeley DB
MemcacheDB
Redis | 可以通过 key 快速查询到其 value。一般来说,存储不管 value 的格式,照单全收。(Redis 包含了其他功能) |
| 图存储 | Neo4J
FlockDB | 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
| 对象存储 | db4o
Versant | 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
| xml 数据库 | Berkeley DB XML
BaseX | 高效的存储 XML 数据,并支持 XML 的内部查询语法,比如 XQuery,Xpath。 |

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value),组成,MongoDB 文档类似于 JSON 对象,字段值可以包含其他文档、数组、文档数组

主要

SQL 术语/概念 MongoDB 术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB 不支持
primary key primary key 主键,MongoDB 自动将_id 字段设置为主键

对比一下:

MongoDB 安装

kali 上安装运行出现 *段错误 *未解决
ubuntu 上一次性成功
mongodb-linux-x86_64-3.0.6.tgz

1
2
3
tar -xvzf mongodb-linux-x86_64-3.0.6.tgz    //解压
mv mongodb-linux-x86_64-3.0.6 /usr/local/mongodb //将解压后的文件移动到指定目录并改名
cd /usr/local/mongodb/ //切换到mongodb

在 mongodb 目录下创建目录 data/db ,以及/log 目录

1
2
3
4
mkdir data  //创建data目录
mkdir log //创建log日志目录
cd data //切换到data目录
mkdir db //创建db 目录

系统 profile 配置,配置环境,这是每装一个软件的必备步骤,在 profile 文件最后面添加环境变量

1
2
3
4
vi /etc/profile

export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin

保存后,重启系统配置

1
source /etc/profile

在 mongodb 目录下创建 conf 目录,并创建 mongodb.conf 配置文件

1
2
3
4
cd /usr/local/mongodb/    //切换到mongodb
mkdir conf //创建conf目录
cd conf //切换到conf
touch mongodb.conf //创建mongodb.conf配置文件

配置一些信息在 mongodb.conf 中:

1
2
3
4
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/log/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true #以守护程序的方式启用,即在后台运行

###

一些准备好,启动服务

1
2
cd /usr/local/mongodb/    //切换到mongodb
./bin/mongod --config ./conf/mongodb.conf //启动服务

连接 mongodb

1
2
cd /usr/local/mongodb/bin
./mongo

停止服务

1
2
cd /usr/local/mongodb/bin
./mongod -shutdown -dbpath=/usr/local/mongodb/data/db //停止mongodb

参考:
https://www.jianshu.com/p/d8f471bdfa3b

基础命令

创建数据库:use database_name,如果有直接拿来用,没有会自动创建 use yichen

删除数据库:db.dropDatabase() 先 use 再删除

创建集合(相当于 mysql 中的表):db.createCollection('hack')

删除集合:db.hack.drop()

查看集合用的是:show tables 或者 show collections

插入数据:db.yichen.insert({'name':'yichen'})

image.png
image.png

插入数据用逗号隔开:

1
2
3
4
5
db.writeup.insert({name:'yichen',
date:'2020-3-11',
tags:'web',
flag:'flag{dhcbuyebcadwe}',
blog:'https://www.yuque.com/hxfqg9'})
image.png
image.png

也可以先把数据定义为一个变量再插入到文档里

image.png
image.png

更新:
db.writeup.update({name:'yiyichen'},{$set:{name:'y1chen'}})

会把 name 为 yiyichen 的 name 改为 y1chen

pretty() 可以更加美观的显示结果

image.png
image.png

移除文档:db.writeup.remove({'name':'y1chen'})

image.png
image.png

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 范例 RDBMS 中的类似语句
等于 db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

and 条件(多个条件用逗号隔开):
db.writeup.find({key1:value1, key2:value2}).pretty()

or 条件:
db.writeup.find({$or:[{"name":"yichen"},{"name": "yiyichen"}]}).pretty()

NoSQL 注入