基于pymongo的学生信息考勤管理系统开发学习笔记
前言
我知道有很多人都写过,以即我之前做系统的时候也看过不少,但是还是错误百出,有的是版本不一致,有的是语法更新突然改了,所以这里我再写一篇,仅用于自我学习,如果对你有帮助我会感到很高兴。
这里说明一下我用的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