Python操作MongoDB教程:插入、查询、修改、排序与删除详解
本文详细介绍如何使用Python通过pymongo库操作MongoDB数据库。内容涵盖从环境配置到实际代码实现,包括插入单个或批量文档、指定ID插入、查询单条或所有数据、按条件及修饰符筛选、限制返回数量、修改记录、排序结果以及删除文档和集合的完整操作流程。
MongoDB是一款基于分布式文件存储架构的数据库系统,它兼具关系型数据库与非关系型数据库的特点,在非关系型数据库(NoSQL)中以其丰富的功能和接近关系型数据库的操作体验而著称。
作为当前最流行的NoSQL数据库之一,MongoDB采用BSON(Binary JSON)格式来存储数据,这种格式类似于JSON,但支持更多的数据类型。
在使用Python操作MongoDB之前,必须确保本地或服务器已正确安装MongoDB服务。具体的安装步骤较为常规,此处不再赘述。
Python需要通过第三方驱动库来连接MongoDB,推荐使用pymongo库,可通过pip命令进行安装。
pip install pymongo
插入文档是数据库操作的基础环节。
在MongoDB中,文档的概念类似于关系型数据库中表的一条记录,由键值对组成。
向集合中插入文档主要使用insert_one()方法。
该方法接收一个字典作为参数,字典中的键值对(name => value)对应文档的字段。
例如,向名为sites的集合中插入一条包含name、alexa和url字段的文档。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
mydict = { "name": "NOWCODER", "alexa": "10000", "url": "https://www.nowcoder.com" }
x = mycol.insert_one(mydict)
print(x)
print(x)
执行插入操作后,控制台会返回相应的结果对象。
<pymongo.results.InsertOneResult object at 0x10a34b288>
获取插入文档的_id字段。
insert_one()方法返回一个InsertOneResult对象,该对象包含inserted_id属性,用于获取系统自动生成的文档唯一标识符。
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['nowcoderdb']
mycol = mydb["sites"]
mydict = { "name": "Google", "alexa": "1", "url": "https://www.google.com" }
x = mycol.insert_one(mydict)
print(x.inserted_id)
打印该属性即可看到生成的_id值。
5b2369cac315325f3698a1cf
插入多个文档。
若需批量插入,可使用insert_many()方法,其参数为一个包含多个字典的列表。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
mylist = [
{ "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
{ "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
{ "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
{ "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
{ "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)批量插入后的输出结果通常包含所有新插入文档的_id。
[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]
插入指定_id的多个文档。
用户也可以自定义文档的_id进行插入,以下示例展示了在site2集合中插入指定_id的数据。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["site2"]
mylist = [
{ "_id": 1, "name": "NOWCODER", "cn_name": "牛客教程"},
{ "_id": 2, "name": "Google", "address": "Google 搜索"},
{ "_id": 3, "name": "Facebook", "address": "脸书"},
{ "_id": 4, "name": "Taobao", "address": "淘宝"},
{ "_id": 5, "name": "Zhihu", "address": "知乎"}
]
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["nowcoderdb"]
mycol = mydb["sites"]
x = mycol.find_one()
print(x)
查询结果以字典形式返回。
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
查询集合中所有数据。
调用find()方法且不传参时,可检索集合中的所有文档,类似于SQL中的SELECT *。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
for x in mycol.find():
print(x)
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}
查询指定字段的数据。
在find()方法中,可以通过设置第二个参数来指定需要返回的字段,将需要返回的字段值设为1,不需要的设为0。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
print(x)
指定返回name和alexa字段的结果如下。
{'name': 'NOWCODER', 'alexa': '10000'} {'name': 'Google', 'alexa': '1'} {'name': 'Taobao', 'alexa': '100'} {'name': 'QQ', 'alexa': '101'} {'name': 'Facebook', 'alexa': '10'} {'name': '知乎', 'alexa': '103'} {'name': 'Github', 'alexa': '109'}
根据指定条件查询。
可以在find()方法中传入查询字典来过滤数据,仅返回符合条件的文档。
例如,查找name字段值为"NOWCODER"的文档。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myquery = { "name": "NOWCODER" }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
匹配到的文档结果如下。
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
高级查询。
在查询条件中,可以使用MongoDB提供的修饰符进行更复杂的筛选。
以下示例用于查找name字段首字母ASCII值大于"H"的文档,使用{"$gt": "H"}作为大于修饰符条件。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myquery = { "name": { "$gt": "H" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
符合该条件的文档结果如下。
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'} {'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'} {'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'} {'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
返回指定条数记录。
若需限制查询结果的数量,可使用limit()方法,该方法接收一个整数参数作为返回记录的上限。
例如,限制只返回前3条文档记录。
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myresult = mycol.find().limit(3)
# 输出结果
for x in myresult:
print(x)
最终输出的结果仅包含三条数据。
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'} {'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'} {'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
修改文档。
使用update_one()方法可以修改文档记录,该方法第一个参数为查询条件,第二个参数为更新操作。若匹配多条记录,默认只修改第一条。
例如,将alexa字段的值从10000修改为12345。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myquery = { "alexa": "10000" }
newvalues = { "$set": { "alexa": "12345" } }
mycol.update_one(myquery, newvalues)
# 输出修改后的 "sites" 集合
for x in mycol.find():
print(x)
若需修改所有匹配的记录,应使用update_many()方法。
以下示例查找所有name字段以F开头的文档,并将它们的alexa字段统一修改为123。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")
排序。
sort()方法用于对查询结果进行排序,支持升序或降序。
sort()方法第一个参数指定排序字段,第二个参数指定排序规则:1表示升序,-1表示降序,默认值为1(升序)。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
mydoc = mycol.find().sort("alexa")
for x in mydoc:
print(x)
上述代码实现了对alexa字段按升序进行排序。
删除数据。
使用delete_one()方法可删除单个文档,第一个参数为指定要删除数据的查询对象。
例如,删除name字段值为"Taobao"的文档。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
print(x)
删除多个文档。
使用delete_many()方法可批量删除文档,第一个参数为指定要删除数据的查询对象。
例如,删除所有name字段以F开头的文档。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
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["nowcoderdb"]
mycol = mydb["sites"]
x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")
执行后的结果如下所示。
5 个文档已删除
删除集合。
使用drop()方法可以彻底删除一个集合。
以下示例演示了删除customers集合的操作。
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]
mycol.drop()
若删除成功,drop()返回true;若集合不存在导致删除失败,则返回false。
至此,关于Python操作MongoDB的插入、查询、修改、排序及删除教程已介绍完毕,更多相关内容请参阅本站其他文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









