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()

相关推荐
NO.10243 小时前
11.4八股
java·linux·数据库
闲人编程3 小时前
用Python控制硬件:Raspberry Pi项目初体验
开发语言·python·raspberry·pi·codecapsule·控制硬件
寻星探路3 小时前
测试开发话题10---自动化测试常用函数(2)
java·前端·python
鸢尾掠地平4 小时前
Python中常用内置函数上【含代码理解】
开发语言·python
萧鼎4 小时前
Python 图像处理利器:Pillow 深度详解与实战应用
图像处理·python·pillow
Dxy12393102164 小时前
MySQL的UPPER函数介绍
数据库·mysql
高洁014 小时前
大模型-详解 Vision Transformer (ViT)
人工智能·python·深度学习·算法·transformer
倔强的石头_4 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库
yuezhilangniao4 小时前
mysql mogoDB pg redis-四大数据库选型-数据库对比大白话指南
数据库·redis·mysql