MongoDB和mongoengine

这篇博客详细介绍了如何使用Python的pymongo库连接MongoDB数据库,执行SQL-like操作,如查找(find)、增加(add)、更新(update)和删除(delete)数据。此外,还涵盖了MongoDB与Django的集成以及文件上传和下载的实现,包括文件保存和下载逻辑。内容实用,适合MongoDB初学者和开发者。
摘要由CSDN通过智能技术生成

MongoDB

原生MongoDB SQL

python连接数据库

import pymongo

client = pymongo.MongoClient(host='xxx.xxx.xxx.xxx', port=28018)
db = client['xxxxxx']
# 可以避免有些时候的认证错误提示
db.authenticate('xxxxxx', "xxxxxx")

SQL语句

find

db.hospital_subject_template_test.find({
    '填报表格数据.学科建设团队.现有团队': {
        '$elemMatch': {
            'id': 2,
            '学术任职情况.id': 4353445
        }
    }
})

add

# 使用 push 关键字,在 array 数据类型的之后位置插入一条新的数据
db.catalogue_classify.update(
	{'name': f'{big_classify}'},
	{'$push': {f'details.{small_classify}': data}}
)

# 使用 $each 和 $position 在指定的位置插入元素
db.catalogue_classify.update(
	{'name': f'{big_classify}'},
	{'$push': {f'details.{small_classify}': {'$each':[data],'$position':-1}}}
)


db.hospital_subject_template_test.update({
    'role': 'h2s1'
}, {
    '$addToSet': {
        '填报表格数据.学科建设团队.现有团队.$[data1].学术任职情况': {
            'test': 'hello——2'
        }
    }
},{'arrayFilters':[{'data1.id':75}]})


db.hospital_subject_template_test.update({
    'role': 'h2s1'
}, {
    '$addToSet': {
        '填报表格数据.学科建设团队.现有团队': {
            'test_1111': 'hello——2'
        }
    }
})


update

# 追加一条新的记录
# update 关键字后面的第一个 dict 为判断条件【字典类型】
# update_dict 是一个待插入的字典
db.catalogue_classify.update(
    {'name': big_classify},
    {'$set': {f'details.{small_classify}': new_ls}}
)


db.hospital_subject_template_test.update({
    '填报表格数据.专利申报.id': 17,
}, {
    '$set': {
        '填报表格数据.专利申报.$[elem].授权人.0': 'test hello'
    }
}, {
    'arrayFilters': [{
        'elem.id': 17,
    }]
})


# SQL
db.hospital_subject_template_test.findOneAndUpdate({
    '填报表格数据.专利申报.id': 1
}, {
    '$set': {
        '填报表格数据.专利申报.$[data].学科': 'python'
    }
},{'arrayFilters':[{'data.id':1}]})

# python
db.hospital_subject_template_test.find_one_and_update(
    filter_dict,
    {'$set': update_dict},
    upsert=True,
    array_filters=array_filter,
)

delete

# update 关键字内部的第一个 dict  是判断条件
# 第二个 dict pull 是带删除的数据
 db.hospital_subject_template_test.update(
     {f'{table_name}.id': data['id']},
     {'$pull': {f'{table_name}': {'id': data['id']}}}
 )



# 删除整条记录
db.hospital_subject_template_test.update({
    '填报表格数据.学科建设团队.现有团队.id': 2
}, {
    '$pull': {
        '填报表格数据.学科建设团队.现有团队': {'id':2}
    }
})

# 删除部分记录 key:value
db.hospital_subject_template_test.update({
    '填报表格数据.学科建设团队.现有团队.id': 2
}, {
    '$unset': {
       '填报表格数据.学科建设团队.现有团队.$.类别': '医生'
    }
})

mongoengine

Django 配置数据库

from mongoengine import connect

connect('databaseName', host='xxx.xxx.xxx.xxx', username="username",
        authentication_source='databaseName',
        password="password", port=28018)

文件上传与下载

文件上传
# model.py
import mongoengine

class UploadFileDemo(mongoengine.Document):
    name = mongoengine.StringField(max_length=255)
    filePath = mongoengine.StringField(max_length=255)
    fileType = mongoengine.StringField(max_length=255)

    meta = {'collection': 'uploadDemo'}
# serializer.py
from rest_framework_mongoengine import serializers

class UploadDemoSerializer(serializers.DocumentSerializer):
    class Meta:
        model = UploadFileDemo
        fields = ["name", "filePath"]
# views.py
from datetime import datetime
from .models import UploadFileDemo
import random
import os

def upload_file_demo(request):
    if request.method == 'POST':
        year = datetime.now().year
        month = datetime.now().month
        day = datetime.now().day
        file = request.FILES.get('filePath')
        name = request.POST.get('name')

        filename, filetype = str(file.name).split('.')
        random_num = random.randint(1000, 9999)

        basic_path = f'./uploadFiles/{year}/{month}/{day}/'
        if not os.path.exists(basic_path):
            os.mkdir(basic_path)
        with open(basic_path + f'{filename}#{random_num}.{filetype}', 'wb+') as f:
            # 分块写入文件
            for chunk in file.chunks():
                f.write(chunk)
            f.close()

        user = UploadFileDemo(name=name, filePath=f'{year}/{month}/{day}/{filename}#{random_num}.{filetype}')
        user.save()
        return HttpResponse('OK')
文件下载
# views.py
from .models import UploadFileDemo
from django.http import HttpResponse, JsonResponse
import re

def down_file_demo(request):
    name = request.GET.get('name')
    try:
        data = list(UploadFileDemo.objects.aggregate([{'$match': {'name': name}, }]))
        path = data[0]['filePath']
        path = re.sub(r'#\d+', "", path)
        file = open(f'./uploadFiles/{str(path)}', 'rb')
        response = HttpResponse(file)
        response['Content-Type'] = 'application/octet-stream'
        filename = f'attachment; filename={path}'
        # 设置文件名的中文编码方式
        response['Content-Disposition'] = filename.encode('utf-8', 'ISO-8859-1')
        return response
    except IndexError as e:
        data = {
            "code": 400,
            'message': '查询的id不存在',
            'error': e,
        }
        return JsonResponse(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值