当先锋百科网

首页 1 2 3 4 5 6 7

MongoDB

1.准备阶段

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

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

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

2.介绍MongoDB:

NoSQL 文件型数据库 非关系型

特点 : 存储自由

举个栗子:

MySQL:

idnameagespwq

1孙悟空999null定海神针

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条,数据条目

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

实现分页(假设每页有两条数据):

limit = 2

page = n

skip = (page-1)*limit

pagelimitskipsort

1201

2221

3241

4261

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