Python语言基础
Python语言进阶
Python数据结构

Python mongodb

搞懂Python mongodb的基本操作

PyMongo

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON),Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

pip 安装

pip 是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。
安装 pymongo:
$ python -m pip3 install pymongo
也可以指定安装的版本:
$ python -m pip3 install pymongo==3.5.1
更新 pymongo 命令:
$ python -m pip3 install --upgrade pymongo

easy_install 安装

旧版的 Python 可以使用 easy_install 来安装,easy_install 也是 Python 包管理工具。
$ python -m easy_install pymongo
更新 pymongo 命令:
$ python -m easy_install -U pymongo

测试 PyMongo

接下来我们可以创建一个测试文件 test_mongodb.py,代码如下:
import pymongo
执行以上代码文件,如果没有出现错误,表示安装成功。

创建数据库

创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。
如下实例中,我们创建的数据库 testdb :
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
注意:在 MongoDB 中,数据库只有在内容插入后才会真正创建。

判断数据库是否已存在

我们可以读取 MongoDB 中的所有数据库,并判断指定的数据库是否存在:
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
 
dblist = myclient.list_database_names()
# dblist = myclient.database_names()
if "testdb" in dblist:
  print("数据库已存在!")

创建集合

MongoDB 中的集合类似 SQL 的表。MongoDB 使用数据库对象来创建集合,实例如下:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
注意:在 MongoDB 中,集合只有在内容插入后才会创建!

判断集合是否已存在

我们可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在:
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['testdb']
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
# 判断 sites 集合是否存在
if "sites" in collist:
  print("集合已存在!")
注意:collection_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_collection_names()。

插入文档

MongoDB 中的一个文档类似 SQL 表中的一条记录,集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对。以下实例向 sites集合中插入文档:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
mydict = { "name": "Lidihuo", "url": "https://www.lidihuo.com" }
x = mycol.insert_one(mydict)

返回 _id 字段

insert_one()方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
import pymongo
 
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['testdb']
mycol = mydb["sites"]
mydict = { "name": "Google", "url": "https://www.google.com" }
x = mycol.insert_one(mydict)
print(x.inserted_id)
运行结果:
5f17ddeaf99e553262c65b88

插入多个文档

集合中插入多个文档使用insert_many()方法,该方法的第一参数是字典列表。
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
mylist = [
  { "name": "Taobao","url": "https://www.taobao.com" },
  { "name": "QQ", "url": "https://www.qq.com" },
  { "name": "Facebook", "url": "https://www.facebook.com" },
  { "name": "知乎","url": "https://www.zhihu.com" },
  { "name": "Github","url": "https://www.github.com" }
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
运行结果:
[ObjectId('5f17de561d5e8966224d5734'), ObjectId('5f17de561d5e8966224d5735'), ObjectId('5f17de561d5e8966224d5736'), ObjectId('5f17de561d5e8966224d5737'), ObjectId('5f17de561d5e8966224d5738')]

插入指定 _id 的多个文档

我们也可以自己指定 id,插入,以下实例我们在 site2 集合中插入数据,_id 为我们指定的:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["site2"]
 
mylist = [
  { "_id": 1, "name": "Lidihuo", "name": "立地货"},
  { "_id": 2, "name": "Google", "name": "Google 搜索"},
  { "_id": 3, "name": "Facebook", "name": "脸书"},
  { "_id": 4, "name": "Taobao", "name": "淘宝"},
  { "_id": 5, "name": "Zhihu", "name": "知乎"}
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
执行结果:
[1, 2, 3, 4, 5]

查询文档

MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

查询一条数据

我们可以使用 find_one() 方法来查询集合中的一条数据。查询 sites 文档中的第一条数据:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
 
x = mycol.find_one()
 
print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}

查询集合中所有数据

find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。以下实例查找 sites 集合中的所有数据:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
for x in mycol.find():
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'}

查询指定字段的数据

我们可以使用 find() 方法来查询指定字段的数据,要查询的字段值设置为 1即可。
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "_id": 0, "name": 1}):
  print(x)
运行结果:
{'name': 'Lidihuo'}
{'name': 'Google'}
{'name': 'Taobao'}
{'name': 'QQ'}
{'name': 'Facebook'}
{'name': '知乎'}
{'name': 'Github'}
除了 _id 你不能在一个对象中同时指定 0 和 1,如果你设置了一个字段为 0,则其他都为 1,反之亦然。
以下实例除了 name 字段外,其他都返回:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "name": 0 }):
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'url': 'https://www.github.com'}

根据指定条件查询

我们可以在 find() 中设置参数来过滤数据。
以下实例查找 name 字段为 "Lidihuo" 的数据
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": "Lidihuo" }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}

高级查询

查询的条件语句中,我们还可以使用修饰符。
以下实例用于读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": { "$gt": "L" } }
mydoc = mycol.find(myquery)
 
for x in mydoc:
  print(x)

使用正则表达式查询

我们还可以使用正则表达式作为修饰符。
正则表达式修饰符只用于搜索字符串的字段。
以下实例用于读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"} :
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^L" } }
mydoc = mycol.find(myquery)
for x in mydoc:
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}

返回指定条数记录

如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
以下实例返回 3 条文档记录:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myresult = mycol.find().limit(3)
 
# 输出结果
for x in myresult:
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}

修改文档

我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。以下实例将 name 字段的值 Lidihuo 改为 LDH:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
 
myquery = { "name": "Lidihuo" }
newvalues = { "$set": { "name": "LDH" } }
mycol.update_one(myquery, newvalues)
# 输出修改后的 "sites" 集合
for x in mycol.find():
  print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'LDH', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'}
update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()。
以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 name 字段修改为 Lidihuo:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^L" } }
newvalues = { "$set": { "name": "Lidihuo" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")
n class="brown">for
x in mycol.find():
  print(x)
运行结果:
1 文档已修改
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'}

排序

sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。对字段 name 按升序排序:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
mydoc = mycol.find().sort("name")
for x in mydoc:
    print(x)
运行结果:
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
对字段 name 按降序排序:
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
mydoc = mycol.find().sort("name", -1)
for x in mydoc:
    print(x)
运行结果:
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'} {'_id': ObjectId('5f17de561d5e8966224d5734'), 'name': 'Taobao', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'} {'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'} {'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'} {'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'} {'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}

删除数据

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
    print(x)
运行结果:
{'_id': ObjectId('5f17ddd0b141d312e5c38e07'), 'name': 'Lidihuo', 'url': 'https://www.lidihuo.com'}
{'_id': ObjectId('5f17ddeaf99e553262c65b88'), 'name': 'Google', 'url': 'https://www.google.com'}
{'_id': ObjectId('5f17de561d5e8966224d5735'), 'name': 'QQ', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5f17de561d5e8966224d5736'), 'name': 'Facebook', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5f17de561d5e8966224d5737'), 'name': '知乎', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5f17de561d5e8966224d5738'), 'name': 'Github', 'url': 'https://www.github.com'}

删除多个文档

我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。
删除所有 name 字段中以 F 开头的文档:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
myquery = { "name": {"$regex": "^F"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")
运行结果:
1 个文档已删除

删除集合中的所有文档

delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")
运行结果:
5 个文档已删除

删除集合

我们可以使用 drop() 方法来删除一个集合。
以下实例删除了 customers 集合:
import pymongo
 
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["testdb"]
mycol = mydb["sites"]
 
mycol.drop()
如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4