NoSQL( Not Only SQL,不仅仅是SQL),是对一类非关系型数据库的统称,多被应用于超大规模数据的存储,比较流行产品有:MongoDB、CouchDB、Redis、Neo4j、HBase、BigTable。
传统的关系型数据库在设计时遵循 ACID 规则----A (Atomicity) 原子性、C (Consistency) 一致性、I (Isolation) 独立性、D (Durability) 持久性。而NoSQL数据库通常对可用性及一致性遵循 BASE 弱要求原则----Basically Available(基本可用)、Soft-state(软状态/柔性事务)、Eventually Consistent(最终一致性)。
MongoDB是一个用C++语言编写的基于分布式文件存储的开源 NoSQL 数据库,其特点是高性能、易部署、易使用,存储数据十分灵活方便。
MongoDB与关系型数据库对比 |
||
---|---|---|
对比项 |
MySQL/Oracle |
MongoDB |
数据库 |
database |
database |
数据表/集合 |
table |
collection |
数据记录行/文档 |
row |
document |
数据字段/域 |
column |
field |
索引 |
index |
index |
联表操作 |
table joins |
MongoDB不支持 |
主键 |
primary key |
MongoDB自动将_id字段设置为主键 |
外键 |
foreign key |
MongoDB不支持 |
MongoDB 将数据存储为BSON(Binary Serialized Document Format,二进制序列化文档格式)文档,该文档类型类似于 JSON 对象(文档由键值对(key-value)组成,字段值可以包含其他文档,数组及文档数组)。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同数据库的数据也会分别放置在不同的文件中。
使用"show dbs" 命令可以显示所有数据库的列表。
> show dbs // 查看所有数据库
admin 0.000GB
config 0.000GB
local 0.000GB
如上所示,在 MongoDB 3.0 以上版本中系统默认创建了三个有特殊用途的数据库:
数据库 |
用途 |
---|---|
admin |
从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。 |
local |
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。 |
config |
当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。 |
下表为 MongoDB 中常用的几种数据类型:
数据类型 |
描述 |
举例 |
---|---|---|
String |
UTF-8 编码的字符串 |
{"name":"pengjunlee"} |
Integer |
32 位或 64 位整型数值,Shell中不支持该类型,默认会将其转换成双精度浮点数值 |
{"weight":60,"height":178} |
Boolean |
布尔值 |
{"on":true} |
Double |
双精度浮点数值 |
{"age":33} |
Array |
数组或列表 |
{"days":["Monday","Sunday"]} |
Timestamp |
时间戳,32位从标准纪元开始距今所经历的秒数+32位某秒中的操作数 |
{"timestamp": new Date().valueOf() } |
Object |
内嵌文档或对象 |
{"address":{"province":"heibei","city":"shijiazhuang"}} |
Null |
空值 |
{"address":null} |
Date |
日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
{"date":new Date()} |
Object ID |
对象 ID |
{"_id":new ObjectId("012345678901234567891234")} |
Binary Data |
二进制数据 |
|
Code |
JavaScript 代码 |
{"x":function(){}} |
Regular expression |
正则表达式 |
{"reg":/book/i} |
命令语法:mongo host:port[/dbName]
[root@hadoop40 ~]# mongo 172.16.250.240:27017/admin // 连接 admin 数据库
MongoDB shell version v4.0.2
connecting to: mongodb://172.16.250.240:27017/admin
MongoDB server version: 4.0.2
> db // 查看当前数据库
admin
列出所有数据库:show dbs
列出当前数据库:db
隐式创建数据库:use dbName
删除当前数据库:db.dropDatabase()
> show dbs // 查看所有数据库
admin 0.000GB
config 0.000GB
local 0.000GB
> db // 查看当前数据库
admin
> use test // 如果数据库不存在,则创建数据库,否则切换到指定数据库
switched to db test
> db // 查看当前数据库
test
// 创建数据库后,需要在其中创建一个集合或插入一个文档,数据库才会被真正创建
> db.createCollection("user") // 显式创建集合
{ "ok" : 1 }
> show dbs // 查看所有数据库
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> db.dropDatabase() // 删除当前所在数据库
{ "dropped" : "test", "ok" : 1 }
> show dbs // 查看所有数据库
admin 0.000GB
config 0.000GB
local 0.000GB
列出所有集合:show collections 或者 show tables
显式创建集合:db.createCollection(collectionName, options)
隐式创建集合:db.collectionName.insert(document)
删除当前集合:db.collectionName.drop()
> show collections // 查看当前数据库中所有的集合
> db.createCollection("customer") // 显式创建 customer 集合
{ "ok" : 1 }
> show tables // 查看当前数据库中所有的集合
customer
> db.customer.drop() // 删除 customer 集合
true
文档CRUD详解参见:https://blog.csdn.net/pengjunlee/article/details/83472088
下面仅列举了一些其他的统计、排序、分页相关示例:
// 统计集合中文档的总数量
> db.customer.count()
// 统计女性顾客的数量
> db.customer.find({gender:"female"}).count()
// 将查询结果按照 age 字段升序排列
> db.customer.find({},{name:1,age:1}).sort({age:1})
// 将查询结果按照 age 字段降序排列,并跳过前两个文档,返回后面的 5 个文档
> db.customer.find({},{name:1,age:1}).sort({age:-1}).skip(2).limit(5)
// 统计分页前文档总数量
> db.customer.find({},{name:1,age:1}).sort({age:-1}).skip(2).limit(5).count(0)
10
// 统计实际返回的文档总数量
> db.customer.find({},{name:1,age:1}).sort({age:-1}).skip(2).limit(5).count(1)
5