MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。具有高性能、高可用性和自动扩展性。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象的BSON。字段值可以包含其他文档,数组及文档数组。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
安装MongoDB
MongoDB支持多种安装方式具体安装可以看官网更多安装方式,我这里只简单介绍源码包安装MongoDB社区版。
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
# 下载源码包
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.2.tgz
# 解压到本地
tar -zxvf mongodb-linux-x86_64-3.6.2.tgz
# 创建mongodb目录
mkdir -p /usr/local/mongodb
# 复制到刚刚创建的目录
cp -R -n mongodb-linux-x86_64-3.6.2/ /usr/local/mongodb
# 定义环境变量,将mongodb bin目录添加进去
export PATH=<mongodb-install-directory>/bin:$PATH
# 创建数据目录,默认为/data/db,如果你的目录不是这里,可以用--dbpath参数指定
mkdir -p /data/db
安装就完成了,就这么简单。
概念解析
下表给出了各种SQL术语和概念,以及相应的MongoDB术语和概念。
下表展示了一些数据库可执行文件和相应的MongoDB可执行文件,注意这个表没有全部列出来。
从上面的图表可以看出,MongoDB中与关系型数据库不同的地方是引入了collection(集合)、document文档的概念.
文档
文档是MongoDB中数据的基本单元,是MongoDB的核心概念,很类似关系数据库中的行(记录)集合可以被看作没有模式的表(表)
collection(集合)
表示一组MongoDB文档。一个集合相当于一个RDBMS表。一个集合存在于一个数据库中。集合没有强制的模式,一个集合中的文档可以有不同的字段。通常,集合中的所有文档都有类似或相关的目的。
数据库
mongodb中多个文档构成集合,多个集合构成数据库。用于集合的物理容器。每个数据库在文件系统上都有自己的一组文件。一个MongoDB服务器通常有多个数据库。
mongo shell
是MongoDB的一个交互式JavaScript接口。您可以使用mongo shell查询和更新数据,并执行管理操作。
可以看下图理解上面的概念:
与python整合
安装PyMongo
PyMongo 是MongoDB的Python驱动程序,不要安装与PyMongo不兼容的第三方“bson”包。PyMongo有自己的bson软件包;
# 执行python -m pip install pymongo命令即可安装,结果如下:
(myenv) [root@ansible myenv]$ python -m pip install pymongo
Collecting pymongo
Downloading pymongo-3.6.0-cp34-cp34m-manylinux1_x86_64.whl (379kB)
100% |████████████████████████████████| 389kB 73kB/s
Installing collected packages: pymongo
Successfully installed pymongo-3.6.0
安装完成后执行导入模块命令,查看是否成功:
>>> import pymongo
>>>
注意:要确定你的机器上安装了MongoDB。
建立连接与操作
# 导入客户端模块
>>> from pymongo import MongoClient
# 创建客户端实例
>>> client = MongoClient()
# 这种方式与上面相同,上面不加参数默认连接的就是localhost和27017端口
>>> client = MongoClient('localhost', 27017)
# 还可以以URI方式连接
>>> client = MongoClient('mongodb://localhost:27017/')
获取数据库
使用client实例中的属性样式访问数据库
>>> db = client.test_database
如果数据库名称是这样的’test-database’,那么使用属性样式访问将不起作用,那么可以使用字典样式访问
>>>db = client['test-database']
获取collection(集合)
>>> collection = db.test_collection
或者(使用字典风格访问):
collection = db['test-collection']
文档
MongoDB中的数据使用json样式的文档表示(并存储)。在PyMongo中,我们使用字典来表示文档。例如,以下字典可能用于表示博客文章:
import datetime
from pymongo import MongoClient
client = MongoClient()
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
插入文档
插入单个文档
要将文档插入到集合中,可以使用insert_one()方法:
import datetime
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
post = {"author": "Maxsu",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
post_id = posts.insert_one(post).inserted_id
print ("post id is ", post_id)
批量插入
将列表作为第一个参数传递给insert_many()来执行批量插入操作
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
new_posts = [{"_id": 1000,
"author": "Curry",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2017, 11, 12, 11, 14)},
{"_id": 1001,"author": "Maxsu",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2019, 11, 10, 10, 45)}]
posts = db.posts
result = posts.insert_many(new_posts)
print("Bulk Inserts Result is :", result.inserted_ids)
#print (post)
查询
单个文档查询
使用find_one()获取单个文档
import datetime
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
post = {"author": "Minsu",
"text": "This blog post belong to Minsu!",
"tags": ["MySQL", "Oracle", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
post_id = posts.insert_one(post).inserted_id
post = posts.find_one({"author": "Maxsu"})
print(post)
#print (post)
查询多个文档
可使用find()方法,find()返回一个Cursor实例,可以遍历返回结果。
from pymongo import MongoClient
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
client = MongoClient()
db = client.pythondb
posts = db.posts
for post in posts.find():
print(post)