admin管理员组

文章数量:1534215

NoSQL与MongoDB简介

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

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}

MongoDB常用操作

连接MongoDB

命令语法: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/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

 

本文标签: 基础MongoDB