Python操作MongoDB教程:插入、查询、修改、排序与删除详解

唐可
唐可
发布时间:2026-10-16 | 6人浏览过
原创

本文详细介绍如何使用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的插入、查询、修改、排序及删除教程已介绍完毕,更多相关内容请参阅本站其他文章。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表