MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于 关系数据库 和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json bson 格式,因此可 以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类 似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持 对数据建立 索引 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

MongoDB下载安装

MongoDB 源码下载地址:https://www.mongodb/try/download/enterprise

将源压缩包上传到linux服务器,并解压到/usr/local/mongodb4目录下

# 创建 /usr/local/mongodb4 目录 mkdir /usr/local/mongodb4 # 解压 mongodb 到上面的目录 tar -zxvf mongodb-linux-x86_64-enterprise-rhel70- 4.2.23 .tgz -C /usr/local/mongodb4
MongoDB的可执行文件位于bin下,所以可以将该目录配置到全局环境变量PATH中,这样运行命令的时候就不用带路径
# 打开 /etc/profile 配置文件,在最下面添加路径配置 vi /etc/profile # profile 中配置 mongodb 可执行脚本的路径 export PATH=/usr/local/mongodb4/mongodb-linux-x86_64-enterprise-rhel70- 4.2.23 /bin:$PATH

 配置完成后,使文件配置生效

source /etc/profile

 创建数据库目录

默认情况下 MongoDB 启动后会初始化以下两个目录: 数据存储目录:
/var/lib/mongodb
日志文件目录:
/var/log/mongodb

 我们在启动前可以先创建这两个目录并设置当前用户有读写权限:

mkdir -p /var/lib/mongodb mkdir -p /var/log/mongodb chown `whoami` /var/lib/mongodb # 设置权限 chown `whoami` /var/log/mongodb # 设置权限

 接下来启动 Mongodb 服务:

#首先安装net-snmp yum install net-snmp 启动服务 mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork

 打开 /var/log/mongodb/mongod.log 文间有信息,说明启动成功。

tail -10f /var/log/mongodb/mongod.log

 MongoDB 初步使用

如果你需要进入 mongodb 后台管理,直接在控制台执行 mongo 命令文件(服务端必须先动)。 MongoDB Shell 是 MongoDB 自带的交互式 Javascript shell,用来对 MongoDB 进行操作和管理的交 互式环境。 当你进入 mongoDB 后台后,它默认会链接到 test 文档(数据库):
[root@localhost ~]# mongo MongoDB shell version v4.2.8 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServi ceName=mongodb Implicit session: session { "id" : UUID("2cfdafc4-dd56-4cfc-933a-187b88711 9b3") } MongoDB server version: 4.2.8 Welcome to the MongoDB shell. ……

 如果要停止 mongodb 可以使用以下命令:

mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --shutdown

 也可以在 mongo 的命令出口中实现:

> use admin switched to db admin > db.shutdownServer()

 使用配置文件的方式启动mongodb

# mongodb 根目录,创建 conf 目录,并在下面创建 mongodb.conf 文件 [root @localhost ~]# mkdir /usr/local/mongodb4/mongodb-linux-x86_64-enterprise-rhel70- 4.2.23 /conf   # 创建配置文件 [root @localhost ~]# vi /usr/local/mongodb4/mongodb-linux-x86_64-enterprise-rhel70- 4.2.23 /conf/mongodb.conf

 配置文件内容

#master配置

#数据存放路径 dbpath=/var/lib/mongodb

#日志存放路径 logpath=/var/log/mongodb/mongodb.log

#以追加的方式记录日志 logappend=true

#mongodb进程所绑定的ip地址 bind_ip=192.168.48.150

#端口号 port=27017

#以后台方式运行进程 fork=true

使用配置文件的方式启动mongodb

# 进入到 mongodb 根目录,然后通过 -f 指定配置文件,启动服务器端 [root @localhost mongodb-linux-x86_64-enterprise-rhel70- 4.2.23 ]# mongod -f ./conf/mongodb.conf # 查看进程 ps -ef | grep mongod # 查看 mongod 状态 # 启动 mongo 客户端连接服务器 mongo # 通过命令 mongo 启动 mongodb 服务器

MongoDB相关概念  

 

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

数据库

一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中(如果没有该目录可以自己创建,也可以自己指定数据库文件目录)。

 

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置 在不同的文件中。

"show dbs" 命令可以显示所有数据的列表。

$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > show dbs local 0.078GB test 0.078GB >

执行 "db" 命令可以显示当前数据库对象或集合

$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > db test >

 运行"use"命令,可以连接到一个指定的数据库。

> use local switched to db local > db local >

 以上实例命令中,"local" 是你要链接的数据库。

 文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

 {"site":"www.baidu", "name":"百度"}

 下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMSMongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )
数据库服务和客户端
Mysqld/Oracle mongod
mysql/sqlplus mongo
集合
{"site":"www.baidu"} {"site":"www.google","name":"Google"}  {"site":"www.baidu","name":"百度 ","num":5}
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。 合法的集合名 集合名不能是空字符串""。 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。 集合名不能以"system."开头,这是为系统集合保留的前缀。 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系 统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里现$。

 capped collections

 Capped collections 就是固定大小的collection。

它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。

Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的collection不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字 节。collection 的数据存储空间值提前分配的。 要注意的是指定的存储大小包含了数据库的头信息。

 db.createCollection("mycoll", {capped:true, size:100000})

在 capped collection 中,你能添加新的对象。 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。 使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。 删除之后,你必须显式的重新创建这个 collection。 在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。

 MongoDB 数据类型

 下表为MongoDB中常用的几种数据类型。

 

数据类型描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采 用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的 日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。
下面说明下几种重要的数据类型。

 ObjectId

 ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时 接下来的 3 个字节是机器标识码 紧接的两个字节由进程 id 组成 PID 最后三个字节是随机数

 MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
> var newObject = ObjectId() > newObject.getTimestamp() ISODate("2017-11-25T07:21:10Z")

 ObjectId 转为字符串

> newObject.str 5a1919e63df83ce79df8b38f

字符串 

BSON 字符串都是 UTF-8 编码。 

时间戳 BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一 个 64 位的值。其中: 前32位是一个 time_t 值(与Unix新纪元相差的秒数) 后32位是在某秒中操作的一个递增的 序数 在单个 mongod 实例中,时间戳值通常是唯一的。 在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。 日期 表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。
> var mydate1 = new Date() // 格林尼治时间 > mydate1 ISODate("2018-03-04T14:58:51.233Z") > typeof mydate1 object > var mydate2 = ISODate() // 格林尼治时间 > mydate2 ISODate("2018-03-04T15:00:45.479Z") > typeof mydate2 object
这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。 返回一个时间类型的字符串:
> var mydate1str = mydate1.toString() > mydate1str Sun Mar 04 2018 14:58:51 GMT+0000 (UTC) > typeof mydate1str string

 或者

> Date() Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)

 MongoDB数据库操作

 创建数据库

 MongoDB 创建数据库的语法格式如下:

use DATABASE_NAME

 如果数据库不存在,则创建数据库,否则切换到指定数据库。

删除数据库

 MongoDB 删除数据库的语法格式如下:

 db.dropDatabase()

 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。

 删除集合

集合删除语法格式如下:

 db.collection.drop()

MongoDB集合操作 

 创建集合(类似于mysql中的创建表)

语法格式:
db.createCollection(name, options)
参数说明: name: 要创建的集合名称 options: 可选参数, 指定有关内存大小及索引的选项 options 可以是如下参数:

 

字段类型描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIn dexId 3.2 之后不再支持该参数。 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max (可选)指定固定集合中包含文档的最大数量。
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

 删除集合

MongoDB 中使用 drop() 方法来删除集合。 语法格式:
db.collection.drop()

插入文档 

文档的数据结构和 JSON 基本一样。 所有存储在集合中的数据都是 BSON 格式。 BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。 MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document) db.COLLECTION_NAME.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使 db.collection.insertOne() db.collection.replaceOne() 来代替。 insert(): 若插入的数据主键已经存在,则会 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

 3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。

db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:  

db.collection.insertOne(   <document>,   { writeConcern: <document> } )

 db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:

 db.collection.insertMany(

[ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> }
参数说明: document:要写入的文档。 writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。 ordered:指定是否按顺序写入,默认 true,按顺序写入。

 更新文档

 

MongoDB 使用 update() save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用 及其区别。 update() 方法 update() 方法用于更新已存在的文档。语法格式如下:

 db.collection.update(

<query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
参数说明: query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set 后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认 是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查 出来多条记录全部更新。 writeConcern :可选,抛出异常的级别

 如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

 save() 方法

save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:

db.collection.save( <document>, { writeConcern: <document> } )
参数说明: document : 文档数据。 writeConcern :可选,抛出异常的级别。

 删除文档

 MongoDB remove() 函数是用来移除集合中的数据。

MongoDB 数据更新可以使用 update() 函数。在执行 remove() 函数前先执行 find() 命令来判断执行的 条件是否正确,这是一个比较好的习惯。 语法 remove() 方法的基本语法格式如下所示:
db.collection.remove( <query>, <justOne> )

 如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:

db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
参数说明: query :(可选)删除的文档的条件。 justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 writeConcern :(可选)抛出异常的级别。

查询文档 

MongoDB 查询文档使用 find() 方法。 find() 方法以非结构化的方式来显示所有文档。 语法 MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)
query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数 即可(默认省略)。

 如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

>db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。 MongoDB 与 RDBMS Where 语句比较

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

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

 MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。 语法格式如下:

 >db.col.find({key1:value1, key2:value2}).pretty()

MongoDB OR 条件 

MongoDB OR 条件语句使用了关键字 $or ,语法格式如下:
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
AND 和 OR 联合使用 以下实例演示了 AND 和 OR 联合使用

 

>db.col.find({"likes": {$gt:50}, $or: [{"by": " 菜鸟教程 "},{"title": "MongoD B 教程 "}]}).pretty()   { "_id" : ObjectId("56063f17ade2f21f36b03133"), "title" : "MongoDB 教程 ", "description" : "MongoDB 是一个 Nosql 数据库 ", "by" : " 菜鸟教程 ", "url" : "http://www.runoob", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

 条件操作符

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。 在本章节中,我们将讨论如何在MongoDB中使用条件操作符。 MongoDB中条件操作符有: (>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte 我们使用的数据库名称为"runoob" 我们的集合名称为"col",以下为我们插入的数据。 为了方便测试,我们可以先使用以下命令清空集合 "col" 的数据:

 db.col.remove({})

MongoDB (>) 大于操作符 - $gt

如果你想获取 "col" 集合中 "likes" 大于 100 的数据,你可以使用以下命令:
db.col.find({likes : {$gt : 100}})

MongoDB(>=)大于等于操作符 - $gte

如果你想获取"col"集合中 "likes" 大于等于 100 的数据,你可以使用以下命令:
db.col.find({likes : {$gte : 100}})
MongoDB (<) 小于操作符 - $lt 如果你想获取"col"集合中 "likes" 小于 150 的数据,你可以使用以下命令:
db.col.find({likes : {$lt : 150}})
MongoDB (<=) 小于等于操作符 - $lte 如果你想获取"col"集合中 "likes" 小于等于 150 的数据,你可以使用以下命令:
db.col.find({likes : {$lte : 150}})
MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt 如果你想获取"col"集合中 "likes" 大于100,小于 200 的数据,你可以使用以下命令:
db.col.find({likes : {$lt :200, $gt : 100}})

 

更多推荐

mongodb-1