1 MongoDB

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。具有高性能、高可用性和自动扩展性。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象的BSON。字段值可以包含其他文档,数组及文档数组。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

1.1 安装MongoDB

MongoDB支持多种安装方式具体安装可以看官网更多安装方式,我这里只简单介绍源码包安装MongoDB社区版。

# 下载源码包
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

安装就完成了,就这么简单。

1.2 概念解析

下表给出了各种SQL术语和概念,以及相应的MongoDB术语和概念。

SQL MongoDB 解释
database database 数据库
table collection 数据库表/集合
row document or BSON document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins $lookup, embedded documents 表连接
primary key primary key 指定任何惟一的列或列组合作为主键/在MongoDB中,主键被自动设置为_id字段。

下表展示了一些数据库可执行文件和相应的MongoDB可执行文件,注意这个表没有全部列出来。

server/client MongoDB MySQL Oracle Informix DB2
Database Server mongod mysqld oracle IDS DB2 Server
Database Client mongo mysql sqlplus DB-Access DB2 Client

从上面的图表可以看出,MongoDB中与关系型数据库不同的地方是引入了collection(集合)、document文档的概念.
文档
文档是MongoDB中数据的基本单元,是MongoDB的核心概念,很类似关系数据库中的行(记录)集合可以被看作没有模式的表(表)
collection(集合)
表示一组MongoDB文档。一个集合相当于一个RDBMS表。一个集合存在于一个数据库中。集合没有强制的模式,一个集合中的文档可以有不同的字段。通常,集合中的所有文档都有类似或相关的目的。
数据库
mongodb中多个文档构成集合,多个集合构成数据库。用于集合的物理容器。每个数据库在文件系统上都有自己的一组文件。一个MongoDB服务器通常有多个数据库。
mongo shell
是MongoDB的一个交互式JavaScript接口。您可以使用mongo shell查询和更新数据,并执行管理操作。
可以看下图理解上面的概念:
运维学python之爬虫中级篇(八)MongoDB

2 与python整合

2.1 安装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。

2.2 建立连接与操作

# 导入客户端模块
>>> 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()方法:

#!/usr/bin/python3
#coding=utf-8

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()来执行批量插入操作

#!/usr/bin/python3
#coding=utf-8

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()获取单个文档

#!/usr/bin/python3
#coding=utf-8

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实例,可以遍历返回结果。

#!/usr/bin/python3
#coding=utf-8

from pymongo import MongoClient

client = MongoClient()

db = client.pythondb

posts = db.posts
for post in posts.find():
print(post)

MongoDB就简单介绍到这里,详细MongoDB内容大家可以参考官网

本文部分参考:http://www.yiibai.com/mongodb/mongodb_python.html