外观
Python连接MongoDB
一般使用pymongo连接MongoDB数据库。在venv环境内使用命令pip install pymongo可以安装此模块。
连接数据库
pymongo.MongoClient方法用于创建连接对象,该方法支持MongoDB格式的URL字符串作为参数,也支持指定主机和端口。
client = pymongo.MongoClient(host='localhost', proxy=27019)
client = pymongo.MongoClient('mongodb://localhost:27019/')标准的URI格式如下。
mongodb://[username:password@]host1[:post1][,host2[:post2]]...[,hostN...][/database][?options]部分参数说明如下。
- options:连接选项,若前面不使用
/database,则前面要带上/。
常见的连接URI格式如下:
mongodb://localhost
mongodb://admin:123456@localhost/db1获得client对象后可以通过list_database_names方法获取数据库列表,通过client[dbname]选择或创建一个数据库。
from pymongo import MongoClient
client = MongoClient()
print(client.list_database_names())
db = client['demo']
选取数据库之后,还需要进行集合的操作,即操作文档集合。操作文档集合也是使用db[collection_name]方式。使用db.list_collection_names()可以获取db数据库中的所有文档集合名。
db.list_collection_names()
col = db['test']
col.insert_one({'user': 'name'})
print(db.list_collection_names())
下面的例子将使用一个新数据库db,然后使用集合collection。
from pymongo import MongoClient
client = MongoClient()
db = client['db']
col = db['collection']插入文档
插入单个文档时使用insert_one()方法,插入多个文档时使用insert_Many()方法。前者接受一个字典参数代表要插入的文档,该方法返回一个InsertOneResult对象,该对象包含了inserted_id属性;后者接受一个字典列表作为参数,返回InsertOneResult对象列表。
若插入文档时没有使用_id,MongoDB会自动为每一个文档生成独一无二的id值。
运行前,db数据库内的collection集合没有文档。
# 插入一条数据
col.insert_one({'key1': 'value1'})
# 插入多条数据
col.insert_many([{'key2': 'value2'}, {'key3': 'value3'}])运行结果如下。

随后在命令行运行查询,可以看到插入后的数据。

查询文档
pymongo提供了类似MongoDB客户端的find()和findOne()方法对数据进行查询,在pymongo模块中对应的方法为find、find_one。这两个方法的语法和MongoDB客户端类似。
>>> result = col.find()
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 18}, {'_id': ObjectId('64da42c9deb5a77acd00541f'), 'name': 'Peter', 'age': 19}, {'_id': ObjectId(
'64da42c9deb5a77acd005420'), 'name': 'Bill', 'age': 20}, {'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21}, {'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22}]
>>> col.find_one()
{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 18}
>>> result = col.find({'age': {'$gt': 20}})
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21}, {'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22}]
>>> result = col.find({'name': 'Jack'})
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 18}]pymongo的find、find_one、limit、skip方法和MongoDB中对应的语法一致,也支持使用比较运算符、逻辑运算符、正则表达式、聚合操作。
修改文档
使用update_one()、update_many()方法可以修改文档中的记录。两个方法的参数一样,第一个参数为查询的条件,第二个参数为要修改的字段。
现在从MongoDB客户端查询到的数据如下:

>>> result = col.update_one({'name': 'Jack'},{'$set': {'age': 25}})
>>> result = col.find()
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 25},
{'_id': ObjectId('64da42c9deb5a77acd00541f'), 'name': 'Peter', 'age': 19},
{'_id': ObjectId('64da42c9deb5a77acd005420'), 'name': 'Bill', 'age': 20},
{'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21},
{'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22}]可以看到Jack的年龄已经改变。从MongoDB的客户端查询结果也可以看出改变成功了。

查询结果排序
sort方法可以指定查询的结果是升序还是降序排列,第一个参数为要排序的字段,第二个参数为排序规则,1为升序,-1为降序。
>>> result = col.find().sort('age', 1)
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541f'), 'name': 'Peter', 'age': 19},
{'_id': ObjectId('64da42c9deb5a77acd005420'), 'name': 'Bill', 'age': 20},
{'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21},
{'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22},
{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 25}]
>>> result = col.find().sort('age', -1)
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 25},
{'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22},
{'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21},
{'_id': ObjectId('64da42c9deb5a77acd005420'), 'name': 'Bill', 'age': 20},
{'_id': ObjectId('64da42c9deb5a77acd00541f'), 'name': 'Peter', 'age': 19}]删除操作
常见的操作有删除文档,删除集合。使用delete_one、delete_many方法可以删除文档,它们的第一个参数都为查询条件,使用drop方法删除一个集合,若删除成功会返回True。
>>> result = col.delete_many({'age': {'$lt': 21}})
>>> result = col.find()
>>> list(result)
[{'_id': ObjectId('64da42c9deb5a77acd00541e'), 'name': 'Jack', 'age': 25},
{'_id': ObjectId('64da42c9deb5a77acd005421'), 'name': 'Sun', 'age': 21},
{'_id': ObjectId('64da42c9deb5a77acd005422'), 'name': 'Lin', 'age': 22}]
>>> col.drop()最后在MongoDB客户端运行查询也可以看到collection集合被成功删除了。