MongoDB 基本使用
一、前言
在当前流行的 NoSQL 数据库中,MongoDB 是大家接触比较早而且用得比较多的数据库。MongoDB 是文档型的 NoSQL 数据库,具有大数据量、高并发等优势,文档格式是类似 JSON 的 BSON 格式,但缺点是不能建立实体关系,而且也没有事务管理机制。
BSON 是一种二进制压缩、带类型的 JSON 格式。BSON 主要用于 MongoDB 中,是 MongoDB 的数据存储格式,Json 是像字符串一样存储的,bson 是按结构存储的(像数组或者说是结构体)。
二、下载并启动 MongoDB
2.1 下载 MongoDB
进入官网页面下载,当前为最新版 3.6.2,官网地址:https://www.mongodb.com
Windows 版本分为两种:
zip 压缩包版:
https://downloads.mongodb.com/win32/mongodb-win32-x86_64-enterprise-windows-64-3.6.2.zip
msi安装版:
https://downloads.mongodb.com/win32/mongodb-win32-x86_64-enterprise-windows-64-3.6.2-signed.msi
2.2 启动 MongoDB
比如下载压缩包解压后,进入 bin 目录,有以下常用命令:
mongod:启动 MongoDB 数据库。通常需要指定一个数据存放的目录,默认是 /data/db。如果启动的时候还没有创建 /data/db,则会启动失败。可以通过 --dbpath 参数指定特定的目录,参数详情可以键入 ./mongod --help;
mongo:启动一个 Shell ./mongo,通过 shell 可以对 MongoDB 进行增删该查等操作,MongoDB Shell 是 MongoDB 自带的交互式 Javascript shell,用来对 MongoDB 进行操作和管理的交互式环境;
mongodump:备份数据库;
mongorestore:恢复数据库。
方式一:命令行下运行 MongoDB 服务器
比如 MongoDB 解压后的目录为:F:\software\mongodb,然后依次创建 data 目录和 db 目录,然后进入命令行:
首先,启动 MongoDB 数据库服务,如下:
F:\software\mongodb\bin\mongod --dbpath F:\software\mongodb\data\db
显示结果如下:
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>F:\software\mongodb\bin\mongod --dbpath F:\software\mongo db\data\db 2018-02-07T21:51:18.375+0800 I CONTROL [initandlisten] MongoDB starting : pid=3 484 port=27017 dbpath=F:\software\mongodb\data\db 64-bit host=PC201601051134 2018-02-07T21:51:18.375+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/W indows Server 2008 R2 2018-02-07T21:51:18.376+0800 I CONTROL [initandlisten] db version v3.6.2 2018-02-07T21:51:18.376+0800 I CONTROL [initandlisten] git version: 489d177dbd0 f0420a8ca04d39fd78d0a2c539420 2018-02-07T21:51:18.376+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1u-fips 22 Sep 2016 ......
其次,运行 ./mongo,便会进入 shell,如下:
F:\software\mongodb\bin\mongo
显示结果如下:
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>F:\software\mongodb\bin\mongo MongoDB shell version v3.6.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.2 Server has startup warnings: 2018-02-07T21:51:20.617+0800 I CONTROL [initandlisten] 2018-02-07T21:51:20.618+0800 I CONTROL [initandlisten] ** WARNING: Access contr ol is not enabled for the database. 2018-02-07T21:51:20.620+0800 I CONTROL [initandlisten] ** Read and wri te access to data and configuration is unrestricted. 2018-02-07T21:51:20.621+0800 I CONTROL [initandlisten] 2018-02-07T21:51:20.622+0800 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost. ......
也可以采用第二种方式,将其配置为 MongoDB 服务,任选一个方式启动即可。
2.3 远程连接 MongoDB 服务器
MongoDB 连接远程服务器的命令格式如下:
mongo 远程主机IP或域名:MongoDB端口号/数据库名 -u user -p password
// 指定用户名和密码连接到指定的MongoDB数据库
mongo 192.168.1.200:27017/test -u user -p password
或者使用如下格式:
mongodb://username:password@hostname/dbname
三、命令行使用 MongoDB
下面介绍 MongoDB 的增删改查的命令行操作。
3.1 创建数据库
MongoDB 使用 use DATABASE_NAME 来创建或者切换数据库。
运行"use"命令,可以连接到一个指定的数据库。如果数据库不存在,则创建数据库,否则切换到指定数据库。MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
MongoDB Enterprise > use spring
switched to db spring
执行 "db" 命令可以显示当前数据库对象或集合。
MongoDB Enterprise > db
spring
3.2 删除数据库
先切换到要删除的数据库,然后执行 db.dropDatabase() 删除当前数据库。
MongoDB Enterprise > use javaee
switched to db javaee
MongoDB Enterprise > db.dropDatabase()
{ "ok" : 1 }
3.3 插入文档
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
MongoDB 3.2 版本后还有以下几种语法可用于插入文档:
db.collection.insertOne():向指定集合中插入一条文档数据;
db.collection.insertMany():向指定集合中插入多条文档数据;
如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
MongoDB Enterprise > db.user.insert({_id:"10001",desc:"springboot开发框架",tag:["IT","Spring"],comment:{good:1256,bad:12}}) MongoDB Enterprise > db.user.save({_id:"10002",desc:"java",tag:["IT","编程语言"],comment:{good:56,bad:1}})
"show dbs" 命令可以显示所有非空数据库的列表。
MongoDB Enterprise > show dbs admin 0.000GB config 0.000GB local 0.000GB spring 0.000GB
"show tables" 命令可以显示数据库中的所有集合。
MongoDB Enterprise > show tables
user
3.4 查询文档
MongoDB使用 find(query, projection) 方法查询文档。除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
db.collection.find(query, projection),如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.collection.find(query, projection).pretty()。
无参时,使用 db.collection.find() 查询所有文档:
MongoDB Enterprise > db.user.find() { "_id" : "10001", "desc" : "springboot开发框架", "tag" : [ "IT", "Spring" ], "comment" : { "good" : 1256, "bad" : 12 } } { "_id" : "10002", "desc" : "java", "tag" : [ "IT", "编程语言" ], "comment" : {"good" : 56, "bad" : 1 } }
通过 id 条件查询:
MongoDB Enterprise > db.user.find({_id:"10001"}) { "_id" : "10001", "desc" : "springboot开发框架", "tag" : [ "IT", "Spring" ], "c omment" : { "good" : 1256, "bad" : 12 } }
通过 comment 查询好评数量小于 1000 的条目:
MongoDB Enterprise > db.user.find({"comment.good":{$lt:1000}}) { "_id" : "10002", "desc" : "java", "tag" : [ "IT", "编程语言" ], "comment" : {"good" : 56, "bad" : 1 } }
也可以使用类似 SQL 的 and、or、in 来查询,传入多个键值对,以下默认使用 and 来查询,好评数量大于 100 且小于 1000 的文档条目
MongoDB Enterprise > db.user.find({"comment.good":{$gt:100},"comment.good":{$lt:1000}}) { "_id" : "10002", "desc" : "java", "tag" : [ "IT", "编程语言" ], "comment" : {"good" : 56, "bad" : 1 } }
使用 or 查询,好评数量大于 1000 或者小于 100 的文档条目:
MongoDB Enterprise > db.user.find({$or:[{"comment.good":{$gt:1000}},{"comment.good":{$lt:100}}]}) { "_id" : "10001", "desc" : "springboot开发框架", "tag" : [ "IT", "Spring" ], "comment" : { "good" : 1256, "bad" : 12 } } { "_id" : "10002", "desc" : "java", "tag" : [ "IT", "编程语言" ], "comment" : {"good" : 56, "bad" : 1 } }
使用 in 查询:
MongoDB Enterprise > db.user.find({_id:{$in:["10001","10002"]}}) { "_id" : "10001", "desc" : "springboot开发框架", "tag" : [ "IT", "Spring" ], "comment" : { "good" : 1256, "bad" : 12 } } { "_id" : "10002", "desc" : "java", "tag" : [ "IT", "编程语言" ], "comment" : {"good" : 56, "bad" : 1 } }
常用操作符:
$gt:greater than >
$gte:gt equal >=
$lt:less than <
$lte:lt equal <=
$ne:not equal !=
$eq:equal =
$in:in
$nin:not in
模糊查询,可使用正则表达式:
MongoDB Enterprise > db.user.find({"desc":/spring/}) { "_id" : "10001", "desc" : "springboot开发框架", "tag" : [ "IT", "Spring" ], "comment" : { "good" : 1256, "bad" : 12 } }
3.5 更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
在3.2版本开始,MongoDB提供以下更新集合文档的方法:
db.collection.updateOne() 向指定集合更新单个文档;
db.collection.updateMany() 向指定集合更新多个文档;
db.collection.replaceOne() 向指定集合替换单个文档;
replaceOne() 与 updateOne() 的区别在与前者是替换整个文档,而后者是更新部分文档。这两个方法都只替换匹配的第一条记录,如果有多条记录匹配,可以使用 updateMany。
MongoDB Enterprise > db.user.updateOne({"_id":"10001"},{$set:{"desc":"基于springboot开发框架"}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
3.6 删除文档
MongoDB remove()函数是用来移除集合中的数据。现在官方推荐使用 deleteOne() 和 deleteMany() 方法,如果使用 deleteMany({}) 方法时候没有指定任何参数,则表示删除该集合中的所有文档。
MongoDB Enterprise > db.user.remove({"_id":"10003"})
WriteResult({ "nRemoved" : 1 })
四、MongoDB 和传统 SQL 术语比较
MongoDB 中的术语与传统 SQL 的术语不太相同,但是之间有一定的对应关系。
SQL术语 | MongoDB术语 | 解释说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | / | 表连接,MongoDB不支持 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |