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