Flask学习Ⅲ (+MongoDB)

MongoDB

1.准备阶段

  • 下载MongoDB https://www.mongodb.com/

  • 默认监听端口:27017 (mysql:3306;redis:6379)

  • MonogDB 启动 指定mongodb数据存储目录

    • mongod --dbpath="D:/mongodb/data/db"

2.介绍MongoDB:

NoSQL 文件型数据库 非关系型
特点 : 存储自由

举个栗子:

MySQL:
id		name		age			sp			wq
1		孙悟空		999			null			定海神针
2		沙悟净		998			唐僧同款项链		null

MongoDB:
{
	id:1,
	name:孙悟空,
	age:999,
	wq:定海神针,
},
{
	id:1,
	name:沙悟净,
	age:998,
	sp:唐僧同款项链
}
可见MongoDB存储的数据之间的格式可以不同!
而且还可以存入列表和字典,只要满足JSON数据即可!

3.MongoDB 基本指令

show databases	            查看本地磁盘中数据库
use databaseName	    切换数据库
db		            查看当前使用的数据库
show tables		    查看当前数据库的表(磁盘中)

4.MongoDB 数据 新建

use 不存在的数据库名 == 在内存中创建该数据库
db.不存在的表名 == 即在该数据库中创建该表(内存中)

总结:使用了不存在的对象即创建该对象!

5.增删改查

db.tableName.insert({})
db.user.insert({name:"沙悟净",age:666.666})
db.user.insert([{},{}])

#官方推荐 3.2+
db.user.insertOne({})			增加一条
db.user.insertMany([{},{}])		批量增加
db.tableName.find({查询条件})	查询符合条件的所有数据
db.user.find({name:"孙悟空"})	条件查询
db.user.find({name:"孙悟空",age:99999})	并列条件查询

db.user.findOne({})	  条件为空查询表中所有数据

$数据比较符(仅用于数字比较)
$lt	小于
$lte	小于等于
$gt	大于
$gte	大于等于
$eq	等号(基本没用)
$ne	不等于
举例: db.user.find({age:{$gt:666}})	查询年龄大于666的数据
db.tableName.update()	修改符合条件的第一条数据

所有MongoDB的修改全部基于 修改器

$修改器

$set
db.user.update({name:"沙悟净"},{$set:{age:888}})
强制的将某字段值修改!
db.user.update({name:"孙悟空"},{$set:{ageage:888}})
如果该字段不存在,即创建该字段并赋值!

$unset
db.user.update({name:"孙悟空"},{$unset:{ageage:1}})
删除字段(别漏了1)

$inc
db.user.update({name:"孙悟空"},{$inc:{age:1}})
引用增加:先引用原有数据,在原有数据基础上增加(没有减,但可以加负数)

针对 Array(List)操作
$push
db.user.update({name:"孙悟空"},{$push:{hobby:"牛魔王"}})
相当于append() 在Array最末端增加

$pushAll
db.user.update({name:"孙悟空"},{$pushAll:{hobby:[...]}})
相当于extend() 在Array最末端增加多条数据

$pull
db.user.update({name:"孙悟空"},{$pull:{hobby:"牛魔王"}})
相当于remove() 删除符合条件的数据

$pullAll
db.user.update({name:"孙悟空"},{$pullAll:{hobby:[...]}})
遍历删除 所有 符合条件的多条数据

$pop
接近于pop(),但只能删除Array中的第一条或最后一条(默认最后一个)
db.user.update({name:"孙悟空"},{$pop:{hobby:-1}})	删除第一个
db.user.update({name:"孙悟空"},{$pop:{hobby:1}})	删除最后一个

# $关键字:
db.user.updateOne({name:"x",hobby:"篮球"},{$set:{"hobby$":"唱歌"}})
db.user.updateOne({name:"x","course.name":"python"},{$set:{"course$":"java"}})
$是用来存储当前Array条件元素的下标索引
当前Array -- ["篮球","摄影","编程"]
条件元素 -- {hobby:"篮球"}
当前Array的第2个元素符合条件,它的下标索引为1
当前$的值即为1

注意:如果使用".索引"的方式来操作Array,记得加引号,"字段.索引"!

# 官方推荐
db.user.updateOne({},{})    修改符合条件的第一条数据
db.user.updateMany({},{})	修改符合条件的所有数据
db.tableName.remove({查询条件})	删除符合条件的所有数据
db.user.remove({})	条件为空则删除所有数据!危险!

#官方推荐
db.user.deleteOne({})	删除符合条件的第一条数据
db.user.deleteMany({})  删除符合条件的所有数据,条件为空则删除所有数据!危险!

6.MongoDB的数据类型

ObjectID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键(list,Python中的List哦)
Object:相当于Python中的字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)

7.选取 跳过 排序

排序
db.user.find({}).sort({age:-1})	倒序
db.user.find({}).sort({age:1})	正序
	
跳过
db.user.find({}).skip(n)	跳过n条

选取
db.user.find({}).limit(n)	选取n条,数据条目<n则全部选取

可以一起用,连点(当三个关键字同时出现,无论顺序如何,都按照"排序--跳过--选取"顺序执行)

实现分页(假设每页有两条数据):
limit = 2
page = n
skip = (page-1)*limit

page	limit	skip	sort
1		2		0		1
2		2		2		1
3		2		4		1
4		2		6		1

db.user.find({}).sort({age:-1}).skip(0).limit(2)
db.user.find({}).sort({age:-1}).skip(2).limit(2)
......

Flask + MongoDB

1.首先安装 pymongo 模块

#建立客户端的代码如下
from pymongo import MongoClient

MC = MongoClient("127.0.0.1", 27017)    # 创建链接(即客户端)
mdb = MC["test"]  	#创建test库(记住,mongodb中使用不存在的对象即在内存中新建)

2.简单的登录注册

from flask import Flask, render_template, request, jsonify
from db import mdb
app = Flask(__name__)

@app.route("/reg", methods=["post", "get"])
def reg():
    if request.method == "GET":
        return render_template('reg.html')
    else:
        user_info = request.form.to_dict()
        ret = mdb.user.insert_one(user_info)
        if ret.inserted_id:		# 检查是否插入数据成功,成功会返回ObjectId
            return "注册成功!"
        else:
            return "注册失败..."

@app.route("/login", methods=["post", "get"])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        user_info = request.form.to_dict()
        ret = mdb.user.find_one(user_info)	# 直接将用户输入的信息列表整个放入查询
        if ret:
            return "登陆成功!"
        else:
            return "登陆失败T_T"

if __name__ == '__main__':
    app.run("0.0.0.0", 5000)

3.补充一些小点

# 用$关键字查询,$关键字要带上引号(因为python里面没有$关键字这个说法)
db.user.find_one({"name": "xxx", "age": {"$gt": 80}})

# 查找的时候,find和find_one的区别
find返回的是一个对象,要遍历才能获取到字典形式
find_one直接返回字典形式,无需遍历

# 无论是什么操作,用到ObjectId的时候一定要先导入!
from bson.objectid import ObjectId
db.user.delete_one({"_id": ObjectId('5f69ab88768e4dee9da5d153')})

# ObjectId的坑:
数据进行网络传输前要JSON序列化,而ObjectId不能直接JSON序列化,但其可以先转换为字符串
res = db.user.find_one({"name": "xxx"})
res["_id"] = str(res.get("_id"))
res_json = json.dumps(res)

# 一个很好用的mongdb工具
https://nosqlbooster.com/downloads
posted @ 2020-09-22 20:35  straightup  阅读(224)  评论(0编辑  收藏  举报