1. MongoDB简介
MongoDB 是一款开源的 NoSQL 数据库管理系统,它用 BSON(二进制 JSON)格式存储数据,在数据存储的时候比关系型数据库 MySQL、Oracle、PostgreSQL 等等要更加的灵活。MongoDB 可以很好地应用于大型分布式 Web 应用和大数据量存储场景。
MongoDB 与传统关系型数据库的区别在于它是基于文档的,也就是说,数据可以以 BSON 格式(JSON 的扩展)经过编码后存储在一个文档中,文档可以有不同的结构,这使得数据更加的灵活。
2. MongoDB搭建教程
2.1 下载与安装MongoDB
MongoDB 的官方网站上提供了 Windows、Linux 和 Mac OS X 平台的版本,下载地址为:https://www.mongodb.com/download-center/community
以 Windows 系统为例,下载后解压到指定的目录,比如 C:\mongodb,在命令行下转到 mongodb 的 bin 目录下(C:\mongodb\bin),输入 mongod --dbpath=d:\test\mongodb
,其中 --dbpath
指定数据存储的目录。
命令栏输入,MongoDB 启动后将看到类似以下的信息:
C:\mongodb\bin>mongod --dbpath=d:\test\mongodb
2021-08-10T21:54:19.968+0800 I CONTROL [initandlisten] MongoDB starting : pid=9176 port=27017 dbpath=d:\test\mongodb 64-bit host=DESKTOP-XXXXXXX
2021-08-10T21:54:19.968+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2021-08-10T21:54:19.969+0800 I CONTROL [initandlisten] db version v4.4.8
2021-08-10T21:54:19.970+0800 I CONTROL [initandlisten] git version: f68a3738bdfc0ea5e0d672682f8b830a2262f33e
2021-08-10T21:54:19.970+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.1.1k 25 Mar 2021
2021-08-10T21:54:19.971+0800 I CONTROL [initandlisten] allocator: tcmalloc
2021-08-10T21:54:19.971+0800 I CONTROL [initandlisten] modules: none
2021-08-10T21:54:19.971+0800 I CONTROL [initandlisten] build environment:
...
2.2 MongoDB客户端连接
MongoDB 通过网络进行通讯,客户端可以直接通过 mongoshell 命令行工具或者 MongoDB 客户端驱动程序(如 Java、Python、.NET 等)来连接服务端。
2.3 创建数据库和集合
在 MongoDB 中,数据存储在集合(Collection)中,每个集合都有一个唯一的名称,并且可以有任意数量的文档存储在其中。
在 MongoDB 中,如果你喜欢就可以不用手动创建数据库,而是可以直接创建集合并插入文档。
2.4 MongoDB文档操作
MongoDB 的文档操作是由 MongoDB 查询语言(Query Language)和 JavaScript 语言混合而成,所以非常的直观,同时 MongoDB 支持诸如插入、查询、删除、修改等常用的操作。
3. 实现数据存储
3.1 数据库与集合的创建
在 MongoDB 中,虽然你可以不手动创建数据库和集合,但为了更好的管理数据,建议手动创建。
打开命令行工具,如果没有直接在 bin 目录运行,输入mongo命令连接到 MongoDB 服务,出现以下信息就说明连接成功了。
C:\mongodb\bin>mongo
MongoDB shell version v4.4.8
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("9d9dd005-bb4a-481f-ba6a-3456528726c7") }
MongoDB server version: 4.4.8
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
>
创建数据库
> use test //创建一个名叫test的数据库
查看当前所有的数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
创建集合
> db.createCollection("user") //创建一个名叫user的集合
{ "ok" : 1 }
查看数据库的所有集合
> show collections
user
3.2 文档操作
插入文档
在 user 集合中插入一条数据
> db.user.insert({"name":"张三","age":18,"gender":"男"})
WriteResult({ "nInserted" : 1 })
在 user 集合中插入多个数据
> db.user.insert([
... {"name":"李四","age":20,"gender":"男"},
... {"name":"王五","age":25,"gender":"女"},
... {"name":"赵六","age":28,"gender":"男"}
... ])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
查询文档
查询所有数据
> db.user.find()
{ "_id" : ObjectId("6112e449b3c95a68bcab7eb1"), "name" : "张三", "age" : 18, "gender" : "男" }
{ "_id" : ObjectId("6112e71cb3c95a68bcab7eb2"), "name" : "李四", "age" : 20, "gender" : "男" }
{ "_id" : ObjectId("6112e71cb3c95a68bcab7eb3"), "name" : "王五", "age" : 25, "gender" : "女" }
{ "_id" : ObjectId("6112e71cb3c95a68bcab7eb4"), "name" : "赵六", "age" : 28, "gender" : "男" }
根据条件查询
//查询名字叫'张三'的文档
> db.user.find({"name":"张三"})
{ "_id" : ObjectId("6112e449b3c95a68bcab7eb1"), "name" : "张三", "age" : 18, "gender" : "男" }
//查询年龄大于20的文档
> db.user.find({"age":{$gt:20}})
{ "_id" : ObjectId("6112e71cb3c95a68bcab7eb3"), "name" : "王五", "age" : 25, "gender" : "女" }
{ "_id" : ObjectId("6112e71cb3c95a68bcab7eb4"), "name" : "赵六", "age" : 28, "gender" : "男" }
更新文档
更新 name 为 '张三' 的文档所对应的 age 字段值为 20
> db.user.update({"name":"张三"},{$set:{"age":20}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更新 age 大于等于 25 的文档所对应的 gender 字段值为 '保密'
> db.user.update({"age":{$gte:"25"}},{$set:{"gender":"保密"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
删除文档
删除 age 大于等于 25 的文档
> db.user.remove({"age":{$gte:"25"}})
WriteResult({ "nRemoved" : 2 })
3.3 MongoDB的聚合操作
聚合操作是 MongoDB 中高级查询的部分。聚合操作可以用于多项计算以及将计算结果与文档相关联。查询语言使用 MongoDB 聚合管道机制构建。
聚合操作函数包括:
$group
- 将集合中的文档分组,可用于聚合操作。
$match
- 过滤集合中文档,只输出符合条件的文档。
$limit
- 用来限制 MongoDB 聚合管道返回的文档数。
$skip
- 在聚合管道中跳过指定数量的文档,并返回余下的文档。
$sort
- 将输入文档排序后输出。
$unwind
- 对数组字段进行 deconstruct 操作。
$project
- 修改输入文档的结构,进行重构。
举个例子:
假设现在有一个文档如下:
{"_id":1,"item":"t-shirt","size":[{"size":"S","quantity":25},{"size":"M","quantity":50},{"size":"L","quantity":75}]}
这里的 size 字段是一个数组,在我们查询的过程中,如果要精确匹配其中的某个元素,就需要先使用 $unwind 操作,把数组拆分开来,生产单独的文档。这样做的好处显然是可以更灵活地控制查询条件,而不必再担心要匹配的是数组的哪个元素。
具体的查询语句如下:
db.inventory.aggregate([
// 展开 size 数组
{$unwind: "$size"},
// 对 size 中的 quantity 字段求和
{ $group : { _id : "$item", total_quantity : { $sum : "$size.quantity" } } }
])
4. 总结
通过上面的学习,我们可以发现,MongoDB 数据库非常的灵活,可以让我们进行更加方便的数据存储和查询操作。
与关系型数据库相比,MongoDB 更加适合处理大量非结构化数据,这是其优势的一个方面。同时,MongoDB 数据库还支持分布式、负载均衡和自动故障转移等功能,这对高可用性的大型应用是非常有价值的。