python MongoDB 基础

目录

[一、连接 MongoDB。](#一、连接 MongoDB。)

[二、Mongodb 创建数据库、创建集合。](#二、Mongodb 创建数据库、创建集合。)

[三、Python Mongodb 插入文档。](#三、Python Mongodb 插入文档。)

(1)插入单条文档:insert_one()。

(2)批量插入多个文档:insert_many()。

[(3)插入指定 _id 的多个文档。](#(3)插入指定 _id 的多个文档。)

[四、Python Mongodb 查询文档。](#四、Python Mongodb 查询文档。)

(1)查询单条文档:find_one()。

(2)查询所有文档:find()。

(3)查询指定字段的数据。

[五、Python Mongodb 修改文档。](#五、Python Mongodb 修改文档。)

(1)更新单条文档:update_one()。

(2)修改所有匹配到的记录:update_many()。

[六、Python Mongodb 删除数据。](#六、Python Mongodb 删除数据。)

(1)删除一个文档:delete_one()。

(2)删除多个文档:delete_many()。

(3)删除集合:drop()。

[七、Python Mongodb 排序 sort()。](#七、Python Mongodb 排序 sort()。)


一、连接 MongoDB。

  • Python 连接 MongoDB 需要 MongoDB 驱动,这里使用 PyMongo 驱动进行连接。
  • 第一步:pip 安装 PyMongo。
bash 复制代码
pip install pymongo
  • 第二步:启动本地 MongoDB 服务。

自定义注册 MongoDB 服务https://blog.csdn.net/m0_74363339/article/details/154385766?spm=1001.2014.3001.5501


  • 第三步:使用 python 建立 MongoDB 连接。
python 复制代码
from pymongo import MongoClient

try:
    #client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
    client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
    client.close()
except Exception as e:
    print(str(e))

二、Mongodb 创建数据库、创建集合。

  • 创建数据库:mongodb_test、集合:employees。
  • 注意:集合只有在内容插入后才会创建!也就是创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
python 复制代码
from pymongo import MongoClient

try:
    #client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
    client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
    mydb = client["mongodb_test"]  #不存在自动创建
    print(f"当前数据库名:{mydb.name}")  #当前数据库名:mongodb_test

    employees = mydb["employees"]   #创建集合,类似mysql的表
    print(f"当前集合名:{employees.name}")   #当前集合名:employees

    #只有首次插入时,才会真正在磁盘上创建
    if "employees" in mydb.list_collection_names():
        print("集合已存在")
    else:
        print("集合不存在")   #集合不存在

    client.close()
except Exception as e:
    print(str(e))

三、Python Mongodb 插入文档。

(1)插入单条文档:insert_one()。
  • insert_one()方法的第一个参数是字典(key => value 对)。
  • 插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #插入单条
    emp1 = {"name":"张三","age":28,"department":"技术部","salary":8000}
    result = employees.insert_one(emp1)
    print(result)    #InsertOneResult(ObjectId('69099433483dca40238ddd50'), acknowledged=True)
    print(f"文档id:{result.inserted_id}")   #文档id:69099433483dca40238ddd50
except PyMongoError as e:
    print(str(e))

client.close()
  • insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
(2)批量插入多个文档:insert_many()。
  • insert_many()方法的第一个参数是字典字典列表。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #批量插入多条
    emp_list = [
        {"name": "李四", "age": 28, "department": "产品部", "salary": 9000},
        {"name": "王五", "age": 30, "department": "技术部", "salary": 12000}
    ]
    insert_many_result  = employees.insert_many(emp_list)
    print(f"插入的所有文档对应的 _id:{insert_many_result.inserted_ids}")   #插入的所有文档对应的 _id:[ObjectId('690996ae2b10291d4e19dc7a'), ObjectId('690996ae2b10291d4e19dc7b')]
except PyMongoError as e:
    print(str(e))

client.close()
  • insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。
(3)插入指定 _id 的多个文档。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #手动指定_id,批量插入多条
    emp_list = [
        {"_id": 1, "name": "1", "age": 20, "department": "技术部", "salary": 6666},
        {"_id": 2, "name": "2", "age": 20, "department": "技术部", "salary": 6666}
    ]
    insert_many_result  = employees.insert_many(emp_list)
    print(f"插入文档所有 _id:{insert_many_result.inserted_ids}")   #插入文档所有 _id:[1, 2]
except PyMongoError as e:
    print(str(e))

client.close()

四、Python Mongodb 查询文档。

(1)查询单条文档:find_one()。
  • find_one() 方法查询集合中的一条数据。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #查询employees集合第一条数据
    emp = employees.find_one()
    print(emp)   #{'_id': ObjectId('69099433483dca40238ddd50'), 'name': '张三', 'age': 28, 'department': '技术部', 'salary': 8000}

    #查询单条,带条件
    emp2 = employees.find_one({"name": "李四"})   #{'_id': ObjectId('690996ae2b10291d4e19dc7a'), 'name': '李四', 'age': 28, 'department': '产品部', 'salary': 9000}
    print(emp2)

except PyMongoError as e:
    print(str(e))

client.close()
(2)查询所有文档:find()。
  • find() 方法可以查询集合中的所有数据。类似 sql 中的 select* 操作。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #查询employees集合所有数据
    empList = employees.find()
    for emp in empList:
        print(emp)

    #条件查询
    #$gt 大于
    for emp in employees.find({"salary":{"$gt":8999}}):
        print(emp["name"],emp["salary"])   #李四 9000 \  王五 12000

except PyMongoError as e:
    print(str(e))

client.close()
(3)查询指定字段的数据。
  • 将要返回的字段对应值设置为 1。
  • 注:除了 _id,你不能在一个对象中同时指定 0 和 1。也就是如果你设置了一个字段为 0,则其他都自动为 1,反之亦然。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #查询employees集合所有数据
    #第一个参数是筛选条件
    #第二个参数是指定需返回的字段,1:返回,0:不返回,_id:默认返回
    empList = employees.find({},{"name":1, "age":1})
    for emp in empList:
        print(emp)   #{'_id': ObjectId('69099433483dca40238ddd50'), 'name': '张三', 'age': 28} ....

    #不返回_id
    empList2 = employees.find({},{"name":1, "age":1, "_id":0}) 
    for emp in empList2:
        print(emp)   #{'name': '张三', 'age': 28} ....

except PyMongoError as e:
    print(str(e))

client.close()

五、Python Mongodb 修改文档。

(1)更新单条文档:update_one()。
  • update_one() 方法只能修匹配到的第一条记录。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #更新前
    for x in employees.find({"name":"王五"},{"name":1,"salary":1}):
        print(x)  #{'_id': ObjectId('690996ae2b10291d4e19dc7b'), 'name': '王五', 'salary': 12000}
        
    #更新第一条满足条件的数据
    myquery = {"name":"王五"}
    newvalues = {"$set":{"salary":15000}}
    result = employees.update_one(myquery,newvalues)  ##执行单条更新

    for x in employees.find({"name":"王五"},{"name":1,"salary":1}):
        print(x)   #{'_id': ObjectId('690996ae2b10291d4e19dc7b'), 'name': '王五', 'salary': 15000}

except PyMongoError as e:
    print(str(e))

client.close()
(2)修改所有匹配到的记录:update_many()。
  • 若需修改所有匹配到的记录,可使用 update_many()方法。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #更新前
    for x in employees.find({"name":"王五"},{"name":1,"salary":1}):
        print(x)  #{'_id': ObjectId('690996ae2b10291d4e19dc7b'), 'name': '王五', 'salary': 15000}

    #批量更新
    #更新所有匹配到的记录
    myquery = {"salary":{"$gt":5000}}
    newvalues = {"$inc":{"salary":1000}}   #salary字段自增1000
    result = employees.update_many(myquery,newvalues)    #执行批量更新
    print(f"匹配到:{result.matched_count} 条记录,{result.modified_count} 条记录已更新")   #匹配到:5 条记录,5 条记录已更新

    for x in employees.find({"name":"王五"},{"name":1,"salary":1}):
        print(x)   #{'_id': ObjectId('690996ae2b10291d4e19dc7b'), 'name': '王五', 'salary': 16000}

except PyMongoError as e:
    print(str(e))

client.close()

六、Python Mongodb 删除数据。

(1)删除一个文档:delete_one()。
  • 使用 delete_one() 方法来删除一个文档,其中该方法第一个参数为查询对象,指定要删除哪些数据。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #删除前
    for x in employees.find({"name":"李四"},{"name":1,"salary":1}):
        print(x)   #{'_id': ObjectId('690996ae2b10291d4e19dc7a'), 'name': '李四', 'salary': 10000}

    #删除单个
    #删除首次匹配到的记录
    myquery = {"name":"李四"}
    result = employees.delete_one(myquery)    #执行单个删除
    print(f"{result.deleted_count} 条记录已删除")   #1 条记录已删除

    after_delete = list(employees.find({"name":"李四"},{"name":1,"salary":1}))
    if not after_delete:
        print("删除成功")  #删除成功

except PyMongoError as e:
    print(str(e))

client.close()
(2)删除多个文档:delete_many()。
  • 用 delete_many() 方法来删除多个文档,其中该方法第一个参数为查询对象,指定要删除哪些数据。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    #删除前
    for x in employees.find({"name":{"$regex":"^1"}},{"name":1,"salary":1}):   #查询匹配name开头为1的
        print(x)   #{'_id': 1, 'name': '1', 'salary': 7666} \ {'_id': 2, 'name': '111', 'salary': 7666}

    #批量删除
    myquery = {"name":{"$regex":"^1"}}
    result = employees.delete_many(myquery) 
    print(f"{result.deleted_count} 个文档被删除")   #2 个文档被删除

    #删除后
    for x in employees.find():   #查询当前所有数据
        print(x)    #{'_id': ObjectId('69099433483dca40238ddd50'), 'name': '张三', 'age': 28, 'department': '技术部', 'salary': 9000} /  {'_id': ObjectId('690996ae2b10291d4e19dc7b'), 'name': '王五', 'age': 30, 'department': '技术部', 'salary': 16000}

except PyMongoError as e:
    print(str(e))

client.close()
(3)删除集合:drop()。
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #创建集合,类似mysql的表

try:
    employees.drop()  #删除集合
    collections = mydb.list_collection_names()
    print(collections)  #[]  

except PyMongoError as e:
    print(str(e))

client.close()

七、Python Mongodb 排序 sort()。

  • sort() 方法可以指定升序或降序排序。
  • sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
  • 多字段排序:当第一个字段相同时,按第二个字段排序,其中 sort() 方法内需传入列表 (字段1,方式1) , (字段2,方式2)
python 复制代码
from pymongo import MongoClient
from pymongo.errors import PyMongoError

#client = MongoClient("mongodb://localhost:27017/")  # 无密码连接
client = MongoClient("mongodb://root:test123123@localhost:27017/")  #启用security认证
mydb = client["mongodb_test"]  #不存在自动创建

employees = mydb["employees"]   #不存在则创建集合,类似mysql的表

try:
    #按薪资升序
    asc_salary = employees.find({},{"name":1,"salary":1,"_id":0}).sort("salary")  #默认升序,也可以手动设置:sort("salary",1)
    for emp in asc_salary:
        print(emp)
# {'name': '1', 'salary': 100}
# {'name': '2', 'salary': 5000}
# {'name': 'Tom', 'salary': 8000.0}
# {'name': '李四', 'salary': 9000}
# {'name': '王五', 'salary': 12000}

    #按年龄降序
    desc_age = employees.find({},{"name":1,"age":1,"_id":0}).sort("age",-1)
    for emp in desc_age:
        print(emp)
# {'name': '王五', 'age': 30}
# {'name': '李四', 'age': 28}
# {'name': 'Tom', 'age': 18}
# {'name': '2', 'age': 2}
# {'name': '1', 'age': 1}

except PyMongoError as e:
    print(str(e))

client.close()

相关推荐
草莓橙子碗26 分钟前
Claude 使用指南
开发语言·python
工具分享34 分钟前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI1 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造1 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏1 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念2 小时前
分子动力学模拟参考文献
python
@insist1232 小时前
系统集成项目管理工程师-信息和文档管理
网络·数据库·软考·系统集成项目管理工程师·软考中项·软件水平考试
HongXu_CaiYi2 小时前
0103-python相关-函数、文件
python
vortex53 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..3 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python