MongoDB是一个基于文档存储的NoSQL数据库管理系统。在深入了解MongoDB是如何存储数据之前,需要先了解MongoDB的基本概念和术语。
MongoDB中的基本概念:
- 数据库:是一组数据的容器,相当于关系型数据库中的“数据库”概念。
- 集合:是一个存储文档的容器,相当于关系型数据库中的“表”概念。
- 文档:是MongoDB中的基本数据单元,相当于关系型数据库中的“行”概念。
- 字段:MongoDB文档中的数据项,相当于关系型数据库中的“列”概念。
MongoDB使用BSON(Binary JSON)格式来表示存储的数据。BSON是一种二进制序列化格式,可以有效地存储和检索数据,并且比JSON更为紧凑和高效。
MongoDB内部在磁盘上存储文档是通过使用MMap的方式将数据映射到虚拟内存来实现的。存储引擎的核心组件是MMFiles,即Mongo Memory Mapped Files,通过将磁盘数据映射到内存,降低了磁盘I/O的压力,提高了读取速度。
MongoDB中采用的是动态模式,即文档中的字段可以随时添加或删除。这种方法可以更好地适应数据结构的改变,避免出现数据抽象层失效的情况。因此,在存储数据时,MongoDB并不需要像传统的关系型数据库一样预先定义表结构。
下面我们通过两个具体的示例,深入了解MongoDB是如何存储数据的。
示例一:将文档存储到MongoDB中
假设我们有如下的JSON文档:
{
"name": "张三",
"age": 25,
"gender": "男",
"address": {
"province": "湖南",
"city": "长沙",
"street": "五一大道"
},
"phone": [
"13800000001",
"13800000002"
]
}
我们可以使用下面的代码将该文档保存到MongoDB中:
import pymongo
# 创建MongoDB数据库连接
client = pymongo.MongoClient('mongodb://localhost:27017/')
# 选择要使用的数据库
db = client['test_database']
# 选择要使用的集合
collection = db['test_collection']
# 创建要保存到集合的文档
document = {
"name": "张三",
"age": 25,
"gender": "男",
"address": {
"province": "湖南",
"city": "长沙",
"street": "五一大道"
},
"phone": [
"13800000001",
"13800000002"
]
}
# 保存文档到集合中
collection.insert_one(document)
在上面的代码中,我们通过pymongo模块创建MongoDB数据库连接,并创建一个test_database的数据库和一个test_collection的集合。然后我们创建一个document变量用来保存要保存到集合中的文档,并通过调用集合的insert_one()函数将该文档保存到集合中。
执行完上述代码后,MongoDB会将该文档以BSON格式保存到磁盘上。
示例二:从MongoDB中检索文档
现在,我们已经将文档存储到MongoDB中了。接下来,我们将演示如何从MongoDB中检索文档。
假设我们要检索所有年龄大于20岁的人的信息。我们可以使用下面的代码实现:
import pymongo
# 创建MongoDB数据库连接
client = pymongo.MongoClient('mongodb://localhost:27017/')
# 选择要使用的数据库
db = client['test_database']
# 选择要使用的集合
collection = db['test_collection']
# 构建查询条件
query = {"age": {"$gt": 20}}
# 查询符合条件的文档
documents = collection.find(query)
# 输出查询结果
for document in documents:
print(document)
在上面的代码中,我们构建了一个查询条件,即age大于20岁,并通过集合的find()函数查询符合条件的文档。查询结果返回的是一个游标,我们可以遍历该游标获取所有符合条件的文档。
在MongoDB中查询文档和在传统的关系型数据库中查询数据的方法不同,MongoDB中采用的是基于文档的查询语言。这些查询语言可以与BSON格式的数据进行交互,有些查询语言在MongoDB中得到支持,例如Aggregation Pipeline语言。
以上就是MongoDB是如何存储数据的完整攻略,包含了两个示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解MongoDB是如何存储数据的 - Python技术站