Python MongoDB

🍦 MongoDB是基于分布式文件存储的数据库,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。

1 MongoDB

  • MongoDB
    • Python需要MongoDB驱动程序用以访问MongoDB数据库,使用PyMongo驱动程序。
    • 使用PIP进行下载并安装驱动,命令窗口输入:python -m pip install pymongo
    • 命令窗口下进入Python交互界面,输入import pymongo回车,没报错说明成功安装。
    • 下载安装并配置MongoDB,可以参看“MongoDB数据库入门到精通看这一篇就够了”。

1-1 创建数据库

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合
mydic = {"name": "John", "address": "Highway 37"}

x = mycol.insert_one(mydic) # 给customers集合插入数据
print(x) # 只有给创建的数据库,创建集合及插入数据后,才能查询到该数据库

1-2 查询数据库

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
# dbslists = myclient.database_names() # 旧版使用
dbslists = myclient.list_database_names()

print(dbslists) # 返回数据库列表
if "mydatabase" in dbslists: # 按名称查询特定数据库
print('I\'m Sorry ~ The database "mydatabase" exists.')

1-3 查集合方法

1
2
3
4
5
6
7
8
9
10
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
# collists = mydbs.collection_names() # 旧版使用
collists = mydbs.list_collection_names()

print(collists) # 返回集合列表
if "customers" in collists: # 按名称查询特定集合
print('The collection "customers" exists.')

2 插入记录

  • 插入记录
    • 不指定id时,MongoDB会自动添加,并给每个记录分配一个唯一的id。
    • 插入单行记录:insert_one()
    • 插入多行记录:insert_many(),第一个参数是一个包含字典的列表。

2-1 返回id字段

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合
mydic = {"name": "Peter", "address": "Lowstreet 27"}

x = mycol.insert_one(mydic) # 插入另一条数据
print(x.inserted_id) # 返回id字段的值

2-2 多记录插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合
mydic = [
{"name": "Amy", "address": "Apple st 652"},
{"name": "Hannah", "address": "Mountain 21"},
{"name": "Michael", "address": "Valley 345"},
{"name": "Sandy", "address": "Ocean blvd 2"},
{"name": "Betty", "address": "Green Grass 1"},
{"name": "Richard", "address": "Sky st 331"},
{"name": "Susan", "address": "One way 98"},
{"name": "Vicky", "address": "Yellow Garden 2"},
{"name": "Ben", "address": "Park Lane 38"},
{"name": "William", "address": "Central st 954"},
{"name": "Chuck", "address": "Main Road 989"},
{"name": "Viola", "address": "Sideway 1633"}
]

x = mycol.insert_many(mydic)
print(x.inserted_ids) # 返回插入的多行记录id值

2-3 插入指定id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合
mydic = [
{"_id": 1, "name": "John", "address": "Highway 37"},
{"_id": 2, "name": "Peter", "address": "Lowstreet 27"},
{"_id": 3, "name": "Amy", "address": "Apple st 652"},
{"_id": 4, "name": "Hannah", "address": "Mountain 21"},
{"_id": 5, "name": "Michael", "address": "Valley 345"},
{"_id": 6, "name": "Sandy", "address": "Ocean blvd 2"},
{"_id": 7, "name": "Betty", "address": "Green Grass 1"},
{"_id": 8, "name": "Richard", "address": "Sky st 331"},
{"_id": 9, "name": "Susan", "address": "One way 98"},
{"_id": 10, "name": "Vicky", "address": "Yellow Garden 2"},
{"_id": 11, "name": "Ben", "address": "Park Lane 38"},
{"_id": 12, "name": "William", "address": "Central st 954"},
{"_id": 13, "name": "Chuck", "address": "Main Road 989"},
{"_id": 14, "name": "Viola", "address": "Sideway 1633"}
]

x = mycol.insert_many(mydic)
print(x.inserted_ids) # 返回插入的多行记录id值

3 查询记录

  • 查询记录
    • 查集合中的第一条记录使用find_one()方法。
    • 查集合中的所有记录则可以使用find()方法。
      • 参数一是一个查询对象,参数二是一个对象(可选),描述要在结果中包含哪些字段。
      • 当且仅当同一个对象中的其中一个值为id字段时,才能同时指定0和1值,否则报错。
    • 进行高级查询,可以使用修饰符作为查询对象中的值。
    • 使用正则表达式进行过滤查询,只能用于查询字符串。
    • sort()方法按升序或降序对结果进行排序(默认升序),接受fieldname和direction参数。
    • 通过使用limit()方法,定义需要返回记录的个数,限制查询结果返回对应个数的记录。

3-1 单条记录

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

x = mycol.find_one() # 查询集合中的第一个记录
print(x)

3-2 所有记录

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

for x in mycol.find(): # 查询集合中的所有记录
print(x)

3-3 指定记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

for x in mycol.find({}, {"_id": 0, "name": 1, "address": 1}):
print(x) # 只返回名称和地址,不返回id值

for y in mycol.find({}, {"address": 0}):
print(y) # 返回结果中排除地址

myque = {"address": "Park Lane 38"}
for z in mycol.find(myque): # 查找地址为“Park Lane 38”的记录
print(z)

3-4 高级查询

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": {"$gt": "S"}} # 查找地址以S及往后字母开头的记录
for x in mycol.find(myque):
print(x)

3-5 正则过滤

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": {"$regex": "^S"}} # 仅查找地址为字母S开头的记录
for x in mycol.find(myque):
print(x)

3-6 升序排序

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

for x in mycol.find().sort("name"): # 按名称字母顺序对结果进行升序排序
print(x)

3-7 降序排序

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

for x in mycol.find().sort("name", -1):
print(x) # 按名称字母顺序对结果进行(反向)降序排序

3-8 限制查询

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

result = mycol.find().limit(5) # 限制结果只返回5条记录
for x in result:
print(x)

4 修改记录

  • 修改记录
    • 修改一条记录:update_one()
      • 第一个参数是一个查询对象,定义要修改的记录。
      • 若查询到多个记录,则只修改第一个出现的记录。
      • 第二个参数是定义记录新值的对象。
    • 修改多条记录:update_many()

4-1 修改单条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": "Valley 345"} # 将地址“Valley 345”改为“Canyon 123”
mynew = {"$set": {"address": "Canyon 123"}}
for x in mycol.find():
print(x) # 查询修改前的记录

print("--------------------------------------------------------------------------------------")

mycol.update_one(myque, mynew)
for x in mycol.find():
print(x) # 查询修改后的记录

4-2 修改多条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": {"$regex": "^S"}} # 将地址以字母S开头的记录,name都改为“Minnie”
mynew = {"$set": {"name": "Minnie"}}
for x in mycol.find():
print(x) # 查询修改前的记录

print("--------------------------------------------------------------------------------------")

y = mycol.update_many(myque, mynew)
print(y.modified_count, "documents updated.")
for x in mycol.find():
print(x) # 查询修改后的记录

5 删除记录

  • 删除记录
    • 删除单个记录:delete_one()方法。
      • 第一个参数是一个查询对象,定义要删除的文档。
      • 若找到多个文档,则只会删除第一个出现的文档。
    • 删除多个记录:delete_many()方法。
      • 第一个参数定义了要删除哪些文档的查询对象。
      • 要删除所有记录,将空查询对象传递给该方法。

5-1 删除单个记录

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": "Mountain 21"} # 删除地址为“Mountain 21”的记录
mycol.delete_one(myque)

5-2 删除多个记录

1
2
3
4
5
6
7
8
9
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

myque = {"address": {"$regex": "^S"}} # 删除地址以字母S开头的所有记录
x = mycol.delete_many(myque)
print(x.deleted_count, "documents deleted.")

5-3 删除所有记录

1
2
3
4
5
6
7
8
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

x = mycol.delete_many({}) # 删除集合中的所有记录
print(x.deleted_count, "documents deleted.")

6 删除集合

1
2
3
4
5
6
7
8
9
10
11
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydbs = myclient["mydatabase"] # 创建mydatabase数据库
mycol = mydbs["customers"] # 创建名为customers的集合

mycol.drop() # 删除名为customers的集合

# collists = mydbs.collection_names() # 旧版使用
collists = mydbs.list_collection_names()
print(collists) # 查询该数据库剩余的集合列表

Python MongoDB
https://stitch-top.github.io/2021/11/03/python/python12-python-mongodb/
作者
Dr.626
发布于
2021年11月3日 22:50:12
许可协议