1. MongoDB 简介
MongoDB 是一个文档型数据库,最大的特点是能够存储 and 操作 JSON-like 的文档,数据非常灵活。在很多场景下可以替代传统的关系型数据库。
2. MongoDB 文档管理
2.1 文档的组织形式
MongoDB 的文档是一种非常灵活的数据形式,与 JSON 非常相似。MongoDB 通过集合来组织文档,集合本身类似于关系数据库中的表,其下面存储了多个文档。一个文档就是一个 bson 对象,在 MongoDB 内部以二进制的形式进行存储。
2.2 文档的基本操作
MongoDB 提供了非常丰富的操作语句,下面我们列举一些基本的文档操作。
插入文档
db.collection.insertOne({ name: 'Tom', age: 18 })
db.collection.insertMany([{ name: 'Tom', age: 18 }, { name: 'Jack', age:20 }])
查找文档
db.collection.find({ name: 'Tom' })
更新文档
db.collection.updateOne({ name: 'Tom' }, { $set: { age: 20 } })
db.collection.updateMany({ name: 'Tom' }, { $set: { age: 20 } })
删除文档
db.collection.deleteOne({ name: 'Tom' })
db.collection.deleteMany({ name: 'Tom' })
2.3 MongoDB 的文件存储分析
除了存储文档以外,MongoDB 还支持通过 GridFS 存储文件,GridFS 是 MongoDB 自带的文件系统。
2.3.1 GridFS 简介
GridFS 是 MongoDB 提供的一种文件存储方式,MongoDB 的文档虽然非常灵活,但是对于大文件而言并不是很友好,因此 GridFS 可以用来存储大文件。
2.3.2 GridFS 的存储方式
GridFS 的存储方式比较特殊,它将一个大文件分为多个块,每个块的大小为默认的 255KB,每个块都是一个 bson 对象,存储到 MongoDB 数据库中。在查询文件时,MongoDB 会将所有块合并为一个大文件返回给客户端。
2.3.3 GridFS 的文件目录排查
在使用 GridFS 存储文件时,MongoDB 会默认为每个文件设置一个唯一标识符 ObjectId,这个标识符会作为文件的 _id。文件的存储目录也与 _id 有关,其组织方式如下:
fs.files:
{
"_id": ObjectId(...),
"filename": "test.txt",
"contentType": "text/plain",
"length": 1234,
"chunkSize": 261120,
"uploadDate": ISODate("2022-06-02T07:15:02.269Z"),
"md5": "b6c2e5486c18693b9a6be487748b1cfa"
}
fs.chunks:
{
"_id": ObjectId(...),
"files_id": ObjectId(...),
"n": 0,
"data": Binary(...)
}
文件的实际存储位置可以通过查看文件的 _id 得到。比如:
ObjectId("62a9b1d048f938dc1ffc2037")
可以查看 Mongo 的存储目录下,dbpath/fs/chunks/62/28/62a9b1d048f938dc1ffc2037_0,这个文件就是存储着分块数据的文件。
3. 总结
MongoDB 是一个非常灵活的 NoSQL 数据库,它的文档型存储方式能够有效地解决传统关系型数据库遇到的一些问题,同时通过 GridFS 还能够很好地处理大文件的存储问题。在使用 MongoDB 时,了解其文档和文件存储方式以及目录结构非常重要。