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

前言

  我知道有很多人都写过,以即我之前做系统的时候也看过不少,但是还是错误百出,有的是版本不一致,有的是语法更新突然改了,所以这里我再写一篇,仅用于自我学习,如果对你有帮助我会感到很高兴。
  这里说明一下我用的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
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个系统其实是出于学习nodejs的目的而改写的系统。 原来的系统前端使用了extjs4.2.1,后端使用了PHP5.4和ZEND框架开发,后台数据库是用mongodb2.2.2。 我抽离出了原来系统中的账户管理,角色管理,菜单管理,权限管理这4个部分, 我想这4个部分,基本上所有的系统都会用到。具有一定的普遍性。所以将这4个部分用nodejs重新改写了。 该系统目前使用模块有express,ejs,connect-mongo,mongodb,express-partials,connect-flash,fibers,wind等 其实wind模块这次系统中没有使用。可以将它排除出去。我是出于学习wind的目的,才加入这个模块的。 本来准备使用wind模块,是为了实现同步的目的,由于后来改用了fibers模块之后,就没有使用它。这里说明一下 不是fibers要比wind好,而是我暂时不能理解wind,或则是说对wind的研究不够吧。 众所周知nodejs是推崇异步模式。但是这个系统是从php过来的,而php的代码是同步模式的写法,所以为了在改写的过程中 希望 1是代码改动最少 2是同步写法更加适合思维习惯。而且代码可读性高的目的,用到了fibers。 这个系统的源代码中有些js文件里保留了一些原来的PHP代码,这是出于代码对比的目的。 是让大家了解原来的php代码是怎么实现的,用nodejs之后是如何改写的。通过对比,大家会发现 其实通过使用fibers之后,几乎两者是一模一样的。 还有源代码中还保留了一些被注释掉的函数,有些是用到了wind,有些是用到了fibers,有些是直接异步的写法。 这些内容都是在开发过程中我不断尝试后的产物。我花了1周的时间才实现了一个递归的调用,而且还是同步的方式。 到目前为止,我还不能理解在异步模式下实现递归调用函数。比如说源代码中有个函数getMenuTree,菜单下面可能有子菜单, 子菜单的下面可能还有菜单。所以是一个递归的过程。我现在是同步的写法实现了这个函数,如果有人能够提供异步写法实现的递归函数并 emai给我,我不胜荣幸。 在使用本系统之前,必须要安装nodejs 0.10.10,mongodb2.2.2,python2.7.5至于安装的方法请googel解决。 将源代码下载之后,解压到某个目录下,比如说d:\nodejs\umav4simple目录。 进入到那个目录, a)运行以下命令 npm install express npm install ejs npm install connect-mongo npm install mongodb npm install express-partials npm install connect-flash npm install fibers npm install wind 尽管在源代码中已包含了这些模块,但是最好还是要重新运行一遍。 因为有些模块可能需要重新的编译。 比如说fibers模块,我在window下运行npm install fibers的时候编译了一个win32-ia32-v8-3.14 而在linux下重新编译了linux-ia32-v8-3.14。所以说根据操作系统的不同,可能会有一些不同。 以免造成想不到的错误。 b)打开settings.js,并且将你的mongodb的设置改写并保存。 c)运行node app.js或则node cluster.js 如果没有提示错误的话,那么就说明环境配置成功了。 d)通过以下的URL可以在mongodb中追加一些数据,不过只能运行一次。否则会重复追加数据。 浏览器上输入 http://localhost:3000/admin/index/install 做完之后, 浏览器上输入http://localhost:3000/ 就通过用户名admin 密码adminadmin进行登录,并使用这个系统了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值