Python连接MongoDB操作
1.安装PyMongo
注意:请勿安装“bson”软件包。 PyMongo配有自己的bson包; 执行“
pip install bson
”或“easy_install bson
”则会安装与PyMongo不兼容的第三方软件包。
使用pip安装
我们建议在所有平台上使用pip来安装pymongo:
C:\Users\Administrator>python -m pip install pymongo
Collecting pymongo
Downloading pymongo-3.4.0.tar.gz (583kB)
... ....
Installing collected packages: pymongo
Running setup.py install for pymongo ... done
Successfully installed pymongo-3.4.0
要获得pymongo的特定版本:
$ python -m pip install pymongo==3.1.1
要升级pymongo的版本:
$ python -m pip install --upgrade pymongo
Python版本依赖
PyMongo支持CPython 2.6,2.7,3.3+,PyPy和PyPy3。
GSSAPI和TLS的可选依赖关系:
GSSAPI认证需要Windows上的Unix或WinKerberos上的pykerberos。PyMongo可以自动安装正确的依赖关系:
$ python -m pip install pymongo[gssapi]
2.使用MongoClient建立连接
使用PyMongo时,第一步是运行 mongod 实例创建一个MongoClient。如下:
from pymongo import MongoClient
client = MongoClient()
上述代码将连接默认主机和端口。 也可以明确指定主机和端口,如下所示:
from pymongo import MongoClient
#client = MongoClient()
client = MongoClient('localhost', 27017)
或使用MongoDB URI格式:
client = MongoClient('mongodb://localhost:27017/')
3.获取数据库
MongoDB的一个实例可以支持多个独立的数据库。 在使用PyMongo时,可以使用MongoClient实例上的属性的方式来访问数据库:
db = client.pythondb
如果数据库名称使用属性方式访问无法正常工作(如:python-db
),则可以使用字典样式访问:
db = client['python-db']
4.获取集合
集合是存储在MongoDB中的一组文档,可以类似于关系数据库中的表。 在PyMongo中获取集合的工作方式与获取数据库相同:
collection = db.python_collection
或(使用字典方式访问):
collection = db['python-collection']
MongoDB中关于集合(和数据库)的一个重要注意事项是它们是懒创建的 - 上述任何命令都没有在MongoDB服务器上实际执行任何操作。当第一个文档插入集合时才创建集合和数据库。
集合是存储在MongoDB中的一组文档,可以被认为大致相当于关系数据库中的表。 在PyMongo中获取集合的工作方式与获取数据库相同:
5.文档
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()}
`
6.插入文档
要将文档插入到集合中,可以使用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)
执行上面代码,得到以下结果 -
post id is 595965fe4959eb09c4451091
插入文档时,如果文档尚未包含“_id
”键,则会自动添加“_id
”。 “_id
”的值在集合中必须是唯一的。 insert_one()
返回一个InsertOneResult
的实例。 有关“_id
”的更多信息,请参阅有关_id文档。
插入第一个文档后,实际上已经在服务器上创建了帖子(posts
)集合。可以列出数据库中的所有集合:
#!/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)
"""
cur_collection = db.collection_names(include_system_collections=False)
print("cur_collection is :", cur_collection)
执行上面代码,得到以下结果 -
cur_collection is : ['posts']
7.使用find_one()获取单个文档
MongoDB中执行的最基本的查询类型是find_one()
。 此方法返回与查询匹配的单个文档(如果没有匹配,则返回None
)。 当知道只有一个匹配的文档,或只对第一个匹配感兴趣时则可考虑使用find_one()
方法。下面示例中使用find_one()
从帖子(posts
)集中获取第一个文档:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
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)
pprint.pprint(posts.find_one())
执行上面代码,得到以下结果 -
{'_id': ObjectId('595965fe4959eb09c4451091'),
'author': 'Maxsu',
'date': datetime.datetime(2017, 7, 2, 21, 30, 38, 402000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
结果是匹配之前插入的字典格式(Json)。注意: 返回的文档包含一个“_id
”,它是在插入时自动添加的。
find_one()
方法还支持查询结果文档必须匹配的特定元素。要查询作者是“Maxsu
”的文档,可以指定查询的条件,如下所示:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
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"})
pprint.pprint(post)
#print (post)
执行上面代码,得到以下结果 -
{'_id': ObjectId('595965fe4959eb09c4451091'),
'author': 'Maxsu',
'date': datetime.datetime(2017, 7, 2, 21, 30, 38, 402000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
8.通过ObjectId查询
也可以通过它的_id
找到一个帖子(post
),下面的示例子中演示如何根据给定的一个ObjectId
查询数据:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
post = {"_id": 100,
"author": "Kuber",
"text": "This is is my first post!",
"tags": ["Docker", "Shell", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
post_id = posts.insert_one(post).inserted_id
print("post_id is :", post_id)
post = posts.find_one({"_id": post_id})
print("Find By Post ID:")
pprint.pprint(post)
#print (post)
执行上面代码,得到以下结果 -
post_id is : 100
Find By Post ID:
{'_id': 100,
'author': 'Kuber',
'date': datetime.datetime(2017, 7, 3, 14, 14, 8, 28000),
'tags': ['Docker', 'Shell', 'pymongo'],
'text': 'This is is my first post!'}
Web应用程序中的常见任务是从请求URL获取ObjectId并找到匹配的文档。 在这种情况下,必须将ObjectId
从一个字符串转换到find_one()
:
from bson.objectid import ObjectId
# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
# Convert from string to ObjectId:
document = client.db.collection.find_one({'_id': ObjectId(post_id)})
9.关于Unicode字符串的注释
您可能已经注意到,我们先前存储的常规Python字符串在从服务器检索时看起来是不同的(例如,u’Mike而不是“Mike”)。一个简短的解释是有序的字符串。
MongoDB以BSON格式存储数据。BSON字符串是UTF-8编码的,所以PyMongo必须确保它存储的任何字符串只包含有效的UTF-8
数据。 常规字符串(<type'str'>
)被验证并保存不变。 Unicode字符串(<type'unicode'>
)首先被编码为UTF-8
。 我们的示例字符串在Python shell中表示为u'Mike
而不是“Mike”
的原因是PyMongo将每个BSON字符串解码为Python unicode
字符串,而不是常规str。
10.批量插入
为了执行更复杂一些的查询,我们再插入一些文档。 除了插入单个文档外,还可以通过将列表作为第一个参数传递给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)
执行上面代码,得到以下结果 -
Bulk Inserts Result is : [1000, 1001]
有几个有趣的事情要注意这个例子:
insert_many()
的结果现在返回两个ObjectId
实例,每个ID表示插入的一个文档。new_posts[1]
具有与其他帖子不同的“形状”(数据结构) - 没有“tags
”字段,添加了一个新字段“title
”。MongoDB是无模式的,表示的就是这个意思。
11.查询多个文档
要查询获得超过单个文档作为查询的结果,可使用find()
方法。find()
返回一个Cursor
实例,它允许遍历所有匹配的文档。如下示例,遍历帖子集合中的每个文档:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
posts = db.posts
for post in posts.find():
pprint.pprint(post)
执行上面代码,得到以下结果 -
{'_id': ObjectId('595965fe4959eb09c4451091'),
'author': 'Maxsu',
'date': datetime.datetime(2017, 7, 2, 21, 30, 38, 402000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
{'_id': 100,
'author': 'Kuber',
'date': datetime.datetime(2017, 7, 3, 14, 14, 8, 28000),
'tags': ['Docker', 'Shell', 'pymongo'],
'text': 'This is is my first post!'}
{'_id': 1000,
'author': 'Curry',
'date': datetime.datetime(2017, 11, 12, 11, 14),
'tags': ['bulk', 'insert'],
'text': 'Another post!'}
{'_id': 1001,
'author': 'Maxsu',
'date': datetime.datetime(2019, 11, 10, 10, 45),
'text': 'and pretty easy too!',
'title': 'MongoDB is fun'}
类似使用find_one()
一样,我们可以将文档传递给find()
来限制返回的结果。 在这里,只希望得到作者是“Maxsu”的文档:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
posts = db.posts
for post in posts.find({"author": "Maxsu"}):
pprint.pprint(post)
执行上面的代码,得到以下结果 -
{'_id': ObjectId('595965fe4959eb09c4451091'),
'author': 'Maxsu',
'date': datetime.datetime(2017, 7, 2, 21, 30, 38, 402000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
{'_id': 1001,
'author': 'Maxsu',
'date': datetime.datetime(2019, 11, 10, 10, 45),
'text': 'and pretty easy too!',
'title': 'MongoDB is fun'}
12.计数统计
如果只想知道有多少文档匹配查询,可以执行count()
方法操作,而不是一个完整的查询。 可以得到一个集合中的所有文档的计数:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
posts = db.posts
print("posts count is = ", posts.count())
print("posts's author is Maxsu count is =", posts.find({"author": "Maxsu"}).count())
执行上面代码,得到以下结果 -
posts count is = 4
posts's author is Maxsu count is = 2
13.范围查询
MongoDB支持许多不同类型的高级查询。例如,可以执行一个查询,将结果限制在比特定日期更早的帖子,而且还可以按作者对结果进行排序:
#!/usr/bin/python3
#coding=utf-8
import datetime
import pprint
from pymongo import MongoClient
client = MongoClient()
db = client.pythondb
posts = db.posts
d = datetime.datetime(2019, 11, 12, 12)
for post in posts.find({"date": {"$lt": d}}).sort("author"):
pprint.pprint(post)
这里使用特殊的“$lt
”运算符做范围查询,并且还可以调用sort()
来按作者对结果进行排序。
14.索引
添加索引可以帮助加速某些查询,并且还可以添加额外的功能来查询和存储文档。在这个例子中,将演示如何在一个键上创建一个唯一的索引,该索引将拒绝已经存在值的文档插入。
首先,我们创建索引:
result = db.profiles.create_index([('user_id', pymongo.ASCENDING)], unique=True)
sorted(list(db.profiles.index_information()))
请注意,现在有两个索引:一个是MongoDB自动创建的在_id
索引,另一个是刚刚创建在user_id
上的索引。
现在来设置一些用户配置文件:
user_profiles = [{'user_id': 211, 'name': 'Luke'},{'user_id': 212, 'name': 'Ziltoid'}]
result = db.profiles.insert_many(user_profiles)
该索引将阻止 user_id
已经在集合中的文档插入:
new_profile = {'user_id': 213, 'name': 'Drew'}
duplicate_profile = {'user_id': 212, 'name': 'Tommy'}
result = db.profiles.insert_one(new_profile) # This is fine.
result = db.profiles.insert_one(duplicate_profile)
## 出现错误提示...
Traceback (most recent call last):
DuplicateKeyError: E11000 duplicate key error index: test_database.profiles.$user_id_1 dup key: { : 212 }
Python连接MongoDB操作的更多相关文章
- MongoDB聚合查询及Python连接MongoDB操作
今日内容概要 聚合查询 Python操作MongoDB 第三方可视化视图工具 今日内容详细 聚合查询 Python操作MongoDB 数据准备 from pymongo import MongoCli ...
- Python连接MongoDB数据库并执行操作
原文:https://blog.51cto.com/1767340368/2092813 环境设置: [root@mongodb ~]# cat /etc/redhat-release CentOS ...
- 爬虫入门【8】Python连接MongoDB的用法简介
MongoDB的连接和数据存取 MongoDB是一种跨平台,面向文档的NoSQL数据库,提供高性能,高可用性并且易于扩展. 包含数据库,集合,文档等几个重要概念. 我们在这里不介绍MongoDB的特点 ...
- 左手Mongodb右手Redis 通过python连接mongodb
首先需要安装第三方包pymongo pip install pymongodb """ 通过python连接mongodb数据库 首先需要初始化数据库连接 "& ...
- python连接mongodb数据库
之前使用过python连接mysql数据库(用到pymysql库),公司也有使用mongodb数据库,所以就整理了一份python连接mongodb数据库的代码出来,以供记录和分享. 首先我们要用到 ...
- Python 连接MongoDB并比较两个字符串相似度的简单示例
本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...
- python连接mysql操作(1)
python连接mysql操作(1) import pymysql import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='10 ...
- python连接MongoDB
1.安装pymongo库 windows下: pip install pymongo 或者 easy_install install pymongo 2.使用pymongo模块连接mongoDB数据库 ...
- python连接,操作 InfluxDB
准备工作 启动服务器 执行如下命令: service influxdb start 示例如下: [root@localhost ~]# service influxdb start Starting ...
随机推荐
- PAT 甲级 1019 General Palindromic Number(简单题)
1019. General Palindromic Number (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- Vsftpd匿名登录设置
修改配置文件 # vi /etc/vsftpd/vsftpd.conf local_enable=NO connect_from_port_20=YES listen=YES listen_port= ...
- Java 集合框架工具类
Collections Arrays Collections 集合框架的工具类, 里面的方法都是静态的, 可以直接使用类名调用 常用方法 1. sort(List<T> list); // ...
- Dom4j总结
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. DOM4J ...
- sql server安装教程(2008 R2,图形界面安装/命令提示符安装即静默安装)
转自:http://blog.51cto.com/jimshu/585023 SQL Server 2008(32/64位)下载地址: 链接:https://pan.baidu.com/s/1eR5b ...
- zookeeper3.4.5集群安装
机器配置: 机器 Hostname user 192.168.169.139 node139 hadoop 192.168.169.140 node140 hadoop 192.168.169.141 ...
- webdriver的API
基本API 1.页面刷新 driver.fresh() 2.页面切换 driver.back(). driver.forward() 3.设置窗口大小 driver.set_wind ...
- Django——请求生命周期
视图层之视图函数(views) 一个视图函数,简称视图,他可以接受Web请求,并且必须返回一个Web响应,响应内容可以是一个HTML内容,一张图片,一个404错误,一个文档等等,都可以称为web为你响 ...
- xshell下载安装
打开网址http://www.netsarang.com/download/software.html 找到最新版的xshell,点击下载 在跳转的页面填写个人信息,许可证类型选择家庭和学校使用,除了 ...
- python 课堂笔记-购物车
# Author:leon production_list = [ ('iphone',5800), ('mac pro', 9800), ('bike', 800), ('watch', 10600 ...