python 操作 MongoDB 数据库

1、安装pymongo库

  • 在cmd命令提示符中输入 pip3 install pymongo

2、创建数据库的连接

import pymongo

coon = pymongo.MongoClient("localhost",27017)  # 创建mongo的连接对象
db = coon.study  # 选择要连接的数据库
my_set = db.student  # 选择要连接的集合
coon.close()  # 关闭数据库连接

3、插入数据

函数说明
insert_one只能插入一个文档,参数为dict类型
insert_many插入一个或多个文档,参数为list类型
insert插入一个或多个文档,参数为dict类型时,插入一个文档,参数为list类型时,插入多个文档
save只能插入一个文档,参数为dict类型,如果_id域值存在,则进行修改操作
  • 插入一条数据 db.insert({ 键1:值1,键2:值2 })
  • 插入多条数据 db.insert([ { 键1:值1,键2:值2},{ 键1:值1,键2:值2} ])
my_set.insert({"stu_name":"苏芮嘉",
               "stu_ID":"2019023127",
               "stu_age":17,
               "stu_hobby":["舞蹈","美术"]})

my_set.insert_many([{"stu_name":"张子涛",
                "stu_ID":"2019023129",
                "stu_age":16,
                "stu_sex":"m",
                "stu_hobby":["篮球","游戏"]},
			   {"stu_name":"刘静怡",
                "stu_ID":"2019023130",
                "stu_age":18,
                "stu_sex":"w",
                "stu_hobby":["美术","旅游"]},
               {"stu_name":"郑昕羽",
                "stu_ID":"2019023132",
                "stu_age":17,
                "stu_sex":"w",
                "stu_hobby":["跆拳道","羽毛球"]}])

4、删除数据

函数说明
remove删除文档,参数是dict数据类型或_id的值,multi参数默认为True,删除满足条件的全部文档
my_set.remove({"stu_name":"郑昕羽"},multi=False) # 只删除查询结果中满足条件的第一个文档

my_set.remove()  # 清空数据

5、查找数据

函数说明
find查找满足条件的全部文档,参数与MongoDB中的写法一样,返回一个游标对象
find_one查找满足条件的第一个文档,返回一个dict类型的数据
  • 比较操作符和逻辑操作符同mongoshell中的使用方法
函数名功能
limit()查询结果显示前几个文档
skip()跳过前几个文档,显示后面的文档
count()统计查询到的文档个数
sort()按照指定的域进行排序,1位升序排列,-1为降序排列
content_list = my_set.find({"stu_age":{"$gt":17}})  # 查找年纪大于17岁的学生
for i in content_list:
    print(i["stu_name"])

for i in content_list.sort([("stu_name", 1)]):   # 排序
    print(i)

6、修改数据

函数说明
update修改文档,参数upsert和multi默认值均为False,用法同mongo shell中的update参数
update_one修改一个文档
update_many修改多个文档,相当于update函数中multi参数取值为True
my_set.update({"stu_ID":"2019023127"},   # 要修改的文档
              {"$set":{"stu_sex":"w"}},  # 需要修改的域和值
              upsert = True,   # 当query部分不存在时,则插入文档,默认值为False
              )
my_set.update({"stu_ID":"2019023127"},   
              {"$set":{"stu_sex":"w"}},  
              multi = True,   # 修改满足要求的全部文档,默认值为False
              )

7、索引操作

  • 创建索引 ensure_index(),返回索引名称列表
index = my_set.ensure_index("stu_name")
print(index)  // [stu_name_1]  索引名称

index = my_set.ensure_index([("stu_name",1),("stu_ID",-1)]) #创建复合索引
  • 创建多个索引 create_indexes(),返回索引名称列表
index_model_1 = pymongo.IndexModel([("stu_name",1),("stu_ID",-1)])  # 生成复合索引对象
index_model_2 = pymongo.IndexModel([("stu_age",1)])
indexes = my_set.create_indexes([index_model_1, index_model_2])  # 创建多个索引
print(indexes)   # ['stu_name_1_stu_ID_-1']
  • 创建唯一索引 unique 参数取值为True
index = my_set.ensure_index("stu_ID",unique=True)
  • 创建稀疏索引 sparse 参数取值为True
index = my_set.ensure_index("stu_name",sparse=True)
  • 查看索引 list_indexes(),返回索引的可迭代对象
for i in my_set.list_indexes():
    print(i)
  • 删除索引drop_index() 和 drop_indexes()
my_set.drop_index("name_1")  # 删除一个索引
my_set.drop_indexex()    # 删除全部索引,除_id域

8、聚合操作

  • 函数:aggregate()
  • 功能:实现MongoDB中的聚合操作
  • 参数:也mongo shell 中参数一致
opt_group = {"$group":{"_id":"$stu_sex","count":{"$sum":1}}} # 分组统计
for i in my_set.aggregate([opt_group]):  # 参数为聚合操作的列表
    print(i)

{'_id': 'w', 'count': 4}
{'_id': 'm', 'count': 2}
{'_id': None, 'count': 1}

9、文件操作

  • 大文件获取
import pymongo
import gridfs

coon = pymongo.MongoClient("127.0.0.1", 27017)
db = coon.grid

fs = gridfs.GridFS(db)  # 获取gridFS对象

files = fs.find()  # 可迭代对象,每个对象为一个文件
for file in files:
    with open(file.filename, "wb") as f:  # file.filename为原文件的存储路径
        while True:   # 循环读写操作
            data = file.read(64)
            if not data:
                break
            f.write(data)  
coon.close()
  • 小文件操作
import pymongo
import bson.binary

coon = pymongo.MongoClient("127.0.0.1", 27017)
db = coon.file  # file数据库不存在,自动创建
my_set = db.image   # 自动创建集合

file = "C:\\Users\\Administrator\\Desktop\\3_weixin_43883022.jpg"

f = open(file, "rb")   # 将文件以二进制读的方式打开
dic = {"content":bson.binary.Binary(f.read()), "filename":"img.jpg"}  # 将文件流数据格式转成Binary格式
my_set.save(dic)  # 将文件插入数据库,有两个域,“content” 和 “filename”

data_list = my_set.find({"filename":"img.jpg"})  # 获取文件对象,可迭代,每个对象对应一个文件
for data in data_list:
    with open("i.jpg", "wb") as f: 
        f.write(data["content"])  # 直接将content域值写入已经打开的文件流对象

coon.close()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值