基于pymongo的学生信息考勤管理系统开发学习笔记之mongo篇

it2023-01-23  55

基于pymongo的学生信息考勤管理系统开发学习笔记

前言Chapter 1. 安装简要第一节 下载安装mongo第二节 配置mongo第三节 安装mongoVue Chapter 2. 数据库语法简要Chapter 3. pymongo语法详细第一节 增第1.1节 增加项第1.2节 列表增加项计算增加第1.3节 复杂结构 第二节 删第2.1节 删除项第2.2节 删除多项 第三节 改第四节 查第4.1节 无条件统计数量第4.2节 有条件统计数量第4.3节 有条件查询项目具体详细

前言

  我知道有很多人都写过,以即我之前做系统的时候也看过不少,但是还是错误百出,有的是版本不一致,有的是语法更新突然改了,所以这里我再写一篇,仅用于自我学习,如果对你有帮助我会感到很高兴。   这里说明一下我用的mongo版本是3.4.4。

第二章可以不看

mongo3.4.4下载链接如此链接: https://pan.baidu.com/s/1o22QRYFZb1gC6QQW_x5USw 提取码:alax

Chapter 1. 安装简要

第一节 下载安装mongo

https://www.mongodb.com/download-center/community

第二节 配置mongo

在你想安置数据库数据的地方创建文件夹,我这里用的位置是E盘下的Study文件夹下的MongoDB文件夹,创建logs、ect、data三个文件夹 在logs文件夹下新建mongo.log文件(新建文本文档改后缀) Data专门存放数据库文件

新建并修改ect文件夹下的配置文件mongo.conf

#数据库路径 dbpath=E:\Study\MongoDB\data\ #日志输出文件路径 logpath=E:\Study\MongoDB\logs\mongodb.log #错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件 logappend=true #启用日志文件,默认启用 journal=true #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false quiet=true #端口号 默认为27017 port=27017 storageEngine=mmapv1 #http配置 httpinterface=true

打开mongo安装后的根目录,复制这个路径,添加环境变量,简化cmd步骤 打开cmd,把mongo添加进服务

mongod --config E:\Study\MongoDB\etc\mongo.conf --install --serviceName "MongoDB"

执行mongo,可以直接开启数据库了

浏览器访问localhost:27017,说明启动成功

第三节 安装mongoVue

mongoVue哪都能下到(如果我链接掉了的话), 一路next安装 点击绿色加号新建连接,名字随便起,Server写127.0.0.1,port写27017 这样就完事了

Chapter 2. 数据库语法简要

本章节来自于当初自学的时候留下的笔记,有些地方可能忘了,非重点,可以不看本章 查看数据库 show dbs 创建(使用)数据库 use demo 创建一个user集合(表) db.createCollection("demo") 往users表里插入一条数据 db.users.insert({id:100,name:"names"})

查看集合(表) show collections 删集合(貌似是删所有集合?时间太久忘了) db.dropDatabase() 删user集合 db.user.drop() 往user集合里插入一条数据 db.user.insert({id:100,name:"names",class:{name:"baidu",id:100}}) 查看user集合下数据 db.user.find() 格式化查看user集合下数据 db.user.find().pretty() 查看user集合下第一条数据 db.user.findOne() 更改user集合下id为100的数据 db.user.update({id:100},{$set:{name:"lala"}}) 查找user集合下id为100的数据 db.user.find({id:100}) 查找user集合下id大于102的数据 db.user.find({id:{$gt:102}}) 查找user集合下id小于102的数据 db.user.find({id:{$lt:102}}) 查找user集合下id等于100的数据 db.user.find({id:{$eq:100}}) 查找user集合下id大于等于102的数据 db.user.find({id:{$gte:102}}) 删除user集合下等于105的数据 db.user.remove({id:105})

Chapter 3. pymongo语法详细

# coding=UTF-8 #字符集为UTF-8 from pymongo import MongoClient #导入pymongo import datetime #导入时间模块 client = MongoClient('localhost', 27017) # 地址与接口 database = client.get_database('test') # 数据库名 collection = database.get_collection('ttest') # 表名

以下内容展示的前提就是我们已经访问了数据库并且拿到一个叫collection的集合,请在测试学习的同学改成自己的数据库名和表名

第一节 增

 首先我们想在程序里建立单个学生的数据结构如下

doc = { '_id': studentID,#字符串 '姓名': name,#字符串 '性别': sex,#字符串 '年龄': age,#数字 '课程': Projects,#字符串 '级别': great,#数字 '班级': classes,#字符串 '教师': teacher,#字符串 '上课时间': time,#字符串 '总课时': int(num),#数字 '当前课时': int(sum),#数字 '提醒日志': awake,#数字 '学员考勤': []#list }

我们给所有变量赋值后放到数据库里

第1.1节 增加项

doc = { '_id': "10010130", '姓名': "seven的小孩", '性别': "男", '年龄': 19, '课程': "Python", '级别': 1, '班级': "Python", '教师': "Seven", '上课时间': "10月1", '总课时': 10, '当前课时': 0, '提醒日志': 1, '学员考勤': [] } def insert(document): result = collection.insert_one(document) return result

那么这里我们调用一下insert(),return出来的东西是<class ‘pymongo.results.InsertOneResult’>,这个类有两个重要属性 .inserted_id的值是成功插入后获取的唯一_id值, .acknowledged的值是True或False(是否成功插入,如果_id重复就是False),

doc = { '_id': "10010130", '姓名': "seven", '性别': "男", '年龄': 19, '课程': "Python", '级别': 1, '班级': "Python", '教师': "Seven", '上课时间': "10月1", '总课时': 10, '当前课时': 0, '提醒日志': 1, '学员考勤': [] } def insert(document): result = collection.insert_one(document) return result re=insert(doc) print(re.acknowledged) #True print(re.inserted_id) #10010129

程序执行后我们观察mongoVue,已经新增了一个学生项目

第1.2节 列表增加项计算增加

def Onekaoqin(studentID,text):#传入学生id键值和当天考勤备注(str) count = collection.count_documents({'_id': studentID})#先查询id的数量是否存在,不存在返回False if count == 0: return False else: filter = {'_id': studentID}#把id做成筛选器 date = datetime.datetime.now()#获取当前时间 # print(type(date)) collection.update_one( filter,#筛选出指定id的项 {"$push": {"学员考勤": [date,text]}}#增加的方法添加时间和备注 ) collection.update_one( filter,#筛选出指定id的项 {'$inc': {'当前课时': 1}}#算数的方法当前课时+1,前提是当前课时必须是数字(int) ) return True Onekaoqin("10010130","测试呀")

collection.count_documents会根据传入的值统计数量,这个会在后面讲到,因为这个功能是老师给学生上课备注使用的,所以在考勤之前,检查传入的学号是否存在,存在,则继续后面的程序,不存在则return False

collection.update_one(筛选器,{"修改器名": {键:值})

这里的修改器我简单介绍,

$ push : 相当于 list.append() 方法,针对list类型$ inc: 可以对当前值进行算数增(减怎么办?尝试增加-1)$ set :对当前字典满足筛选器的项进行修改,如果键名不存在则创建键值对

如果以上的修改器满足不了你,我还找到一个大佬做的blog,欢迎研究: MongoDB 之 $关键字 及 $修改器. 以上代码执行之后我们观察一下数据库 在学员考勤列表里多了一个列表,且第一个时间的格式为datetime,这就是pymongo的好处了!

第1.3节 复杂结构

在【学员考勤】的列表里添加一个字典,字典的键值为当前【学员考勤】列表的长度+1,值为一个列表,列表的第一个值为当前时间,列表的第二个值为备注text,当前课时+1

def Onekaoqin(studentID, text): count = collection.count_documents({'_id': studentID}) countK=collection.find_one({'_id': studentID})#当前id学生的所有信息都在里面 print(countK) lens=len(countK["学员考勤"]) if count == 0: return False else: filter = {'_id': studentID} date = datetime.datetime.now() collection.update_one( filter, {"$push": {"学员考勤": {f"{lens+1}":[date, text]}}} ) collection.update_one( filter, {'$inc': {'当前课时': 1}} ) return True

第二节 删

在本节开始之前请大家用咱们的inset()方法多添加几个学生项目,注意主键“_id”绝对不能重复

第2.1节 删除项

def deleteOne(id): result = collection.delete_one(id) return result.acknowledged delete({"_id":"10010131"})

那么删除很简单了,自定义一个函数叫deleteOne,有一个参数,作为删除的依据,他是一个小字典(筛选器),把他作为参数传进delete_one()即可删除一项,同理还有删除多项的语法

第2.2节 删除多项

def delete(filter): #filter(筛选器) result = collection.delete_one(filter) print(result.acknowledged) delete({"姓名":"同名的人"})

第三节 改

修改方法为update_one(),筛选条件为id值,用set方法修正,这里我为了方便测试带了默认值,但是实际使用请多斟酌,另外,对于1.3节提到的复杂结构,也最好就用set修改

需要一提的是,"_id"是mongo认定唯一键值,不允许修改,如果需要更改学号就只能删了重建

def updateOne(id, name, school="鑫乐汇", sex="女", age="5", projects="Python", great=1, classes="C2", teacher="seven", onclass="周二", num=100, sum=0, rizhi=2): result = collection.update_one( {'_id': id}, {'$set': { '校区': school, '姓名': name, '性别': sex, '年龄': age, '课程': projects, '级别': great, '班级': classes, '教师': teacher, '上课时间': onclass, '总课时': num, '当前课时': sum, '提醒日志': rizhi } } ) return result.acknowledged updateOne("10010131","lalalalala")

数据库样子

第四节 查

第4.1节 无条件统计数量

def getCount(): # 获取学员总数 return collection.count_documents({}) print(getCount())

从当前表执行count_documents()方法,参数为一个空值字典,意思为没有条件,当前代码结果为当前表的所有学员总数

第4.2节 有条件统计数量

def getCountPro(Projects): return collection.count_documents({'课程': Projects}) print(getCountPro("大颗粒"))

从当前表执行count_documents()方法,参数为一个字典键值对,意思是查询存在这个键值对的项,当前代码结果为存在关键字的所有学员总数

第4.3节 有条件查询项目具体详细

def chaXun(txtName, name): # 查询一个人的信息 result = collection.find({txtName: name}).sort("_id") return result print(type(chaXun("课程","大颗粒")))#<class 'pymongo.cursor.Cursor'> a=chaXun("课程","大颗粒") for i in a: print(i)

.find()方法返回的是一个Cursor,相当于迭代器,跟列表还不一样,但是我们可以用for …in…的方法遍历他,结果是

{'_id': '10010131', '姓名': 'lalalalala', '性别': '女', '年龄': '5', '课程': 'Python', '级别': 1, '班级': 'C2', '教师': 'seven', '上课时间': '周二', '总课时': 100, '当前课时': 0, '提醒日志': 2, '学员考勤': [[datetime.datetime(2020, 10, 22, 19, 59, 38, 364000), 'ceccccc1'], [datetime.datetime(2020, 10, 22, 19, 59, 49, 804000), 'ceccccc2'], {'1': [datetime.datetime(2020, 10, 22, 22, 16, 38, 121000), 'ceccccc3']}, {'2': [datetime.datetime(2020, 10, 22, 22, 17, 34, 398000), 'ceccccc3']}, {'2': [datetime.datetime(2020, 10, 22, 22, 22, 52, 330000), 'ceccccc3']}, {'5': [datetime.datetime(2020, 10, 22, 22, 25, 18, 146000), 'ceccccc3']}, {'7': [datetime.datetime(2020, 10, 22, 22, 26, 14, 531000), 'ceccccc3']}], '校区': '鑫乐汇'}

所有的项目都出来了(因为数据库只有一个叫lalalalala的,大家可以尝试多条有相同条件的),.sort("_id")不是必须,作用是按学号从小到大重新排列这个Cursor

我们发现有时候我们并不需要那么多的信息,比如我们只需要id、姓名、课程,那么我们就要在查询数据库的时候增加一个筛选器,这个筛选器的作用为简化提取出来的数据

def chaXun2(txtName, name): # 查询一个人的信息 filter = { '_id': 1, '姓名': 1, '课程': 1 } result = collection.find({txtName: name},filter).sort("_id") return result a=chaXun2("课程","Python") for i in a: print(i)

当前代码的结果为

{'_id': '10010130', '姓名': 'seven', '课程': 'Python'} {'_id': '10010131', '姓名': 'lalalalala', '课程': 'Python'}

这样就精炼了很多

在思考之后,发现i就是一个字典,所以我们可以按照字典的方法把每一项单独拿出来

def chaXun2(txtName, name): # 查询一个人的信息 filter = { '_id': 1, '姓名': 1, '课程': 1 } result = collection.find({txtName: name},filter).sort("_id") return result a=chaXun2("课程","Python") for i in a: print(i['_id'],i['姓名'],i['课程'])

当前代码的结果为

10010130 seven Python 10010131 lalalalala Python
最新回复(0)