MongoDB基础操作
1.mongodb安装后了解
mongo.exe是客户端
mongod.exe是服务器
配置环境变量
默认 监听端口port=27017 3306是mysql,6379是redis的
2.启动配置
启动命令:mongod
直接在cmd输入mongod.exe启动服务器,报错。原因是没有配置好放数据的文件夹
解决方法:在G:\mongodb新建一data文件夹,再在data文件夹里新建一db文件夹---》然后在cmd输入mongod --dbpath="G:/mongodb/data/db/"指定数据存储目录(默认是c盘)。
遇到阻塞状态即成功启动服务器
3.mongodb介绍
Nosql数据库-----》非关系型数据库 mongodb是基于文件操作(redis是基于内存操作的)
mysql和mongodb对比:
#mysql: id name age gender height 1 yq 25 1 null 2 ys 22 null 187 #mongodb: { id:1, name:yq, age:25, gender:1 }, { id:2, name:ys, age:22, height:187 }
总结:Mongodb存储的是JSON数据
4.mongodb基本命令
在cmd输入mongo,打开客户端
指令:
1.show databases 查看本地数据库 -----》在本地磁盘中的 2.use databasename 切换当前使用的数据库 3.db 查看当前使用的数据库 4.show tables 查看当前数据库中的表 ------》在本地磁盘中的表
新建数据库:
use 不存在的数据库名 即创建该数据库 -----》在内存中创建
db.不存在的表名 即在数据库中创建该表 -----》也在内存中
**创建好后新数据库后,使用db可以查看当前的数据库,但使用show databases显示没有;同样新建的表用show tables查看也没有
原因:没有增删改查的数据写入。只要有一条就可以查看。
使用不存在的对象即创建该对象----》在内存里
5.mongodb的数据类型
ObjectId : 每条数据都会自动生成的id----------------》和库表无关 会自增 String : 字符串,必须是utf-8 Boolean :布尔值 true/false Integer : 整数 (一般用Int32) Double :浮点型 (没有float型) Arrays :数组或列表 Object :字典 Null : 空数据类型 Timestamp:时间戳 Date :存储当前日期(不用,用时间戳)
nosqlbooster4mongo -----》mongodb可视化工具
6.增删改查
(1).增:insert
db.tablename.insert({},{}) #增 #官方推荐写法: db.tablename.insertOne({}) #插入一条 db.tablename.insertMany([{},{}]) #插入多条
(2).查 find
db.tablename.find({查询条件}) 查 -----》查询所有符合条件的数据 db.tablename.findOne({}) 查询符合条件的第一条数据 例子: db.tablename.find({查询条件}) 查询所有符合条件的数据 db.tablename.find({name:'ys'}) 条件查询 db.tablename.findOne({name:'ys'}) 只查询一条符合条件的 db.tablename.find({name:'ys',age:25}) /*并列条件查询*/
$数据比较符 ------>仅用于数字型
$gt > db.tablename.find(age:{$gt:20}) #查询年龄大于20的记录 $gte >= db.tablename.find(age:{$gte:20}) #大于等于 $lt < db.tablename.find(age:{$lt:20}) #小于 $lte <= db.tablename.find(age:{$lte:20}) #小于等于 $eq = $ne !=
(3).改 update
a.db.tablename.update({},{}) #改 --》修改符合条件的第一条数据 #官方推荐: db.tablename.updateOne({},{}) # 修改符合条件的第一条数据 db.tablename.updateMany({},{}) # 修改符合条件的所有数据
b.修改器
所有mongodb的修改(update)全部基于修改器
修改器形式:
$修改器 关键字
常用修改器:
$set
强制将某字段值修改,如果该字段不存在,则创建该字段并赋值。
db.tablename.update({age:24},{$set:{age:44}}) db.tablename.update({name:'ys'},{$set:{age:44}}) #ys的age变为44
$unset
删除字段
db.tablename.update({name:'ys'},{$unset:{age:1}}) # 后面那个必须写1
$inc
引用增加 -----》先引用原有数据,再在原有数据基础上增加(可是负数 -10)
db.tablename.update({name:'ys'},{$inc:{age:10}}) #给ys的age加10
不常用:
针对Array List操作
$push==append #在Array类型中增加数据,在最末端---》一条数据 db.tablename.update({name:'ys'},{$push:{hobby:7}}) #hobby是个列表 $pushAll==extends #在Array类型中增加数据,在最末端---》多条数据----》必须是列表类型 db.tablename.update({name:'ys'},{$pushAll:{hobby:[6,8,9,11]}}) $pull==remove() #删除所有符合条件的数据 db.tablename.update({name:'ys'},{$pull:{hobby:7}}) $pullAll #遍历删除符合条件的数据 db.tablename.update({name:'ys'},{$pullAll:{hobby:[6,8,9,11]}}) $pop~pop() #只能删除Array中的第一条和最后一条数据。第一条数据:-1;最后一条:1 db.tablename.update({name:'ys'},{$pop:{hobby:-1}}) #删除第一个数据 db.tablename.update({name:'ys'},{$pop:{hobby:1}}) #删除最后一条数据 pop的正为最后
c.$关键字
$是用来存储符合当前Array条件元素的下标索引
db.tablename.update({name:'ys',hobby:4},{$set:{"hobby.$":5}}) #将hobby列表Array中的4改为5
当前Array---[1,2,3,4,5,6,7,8]
条件元素----hobby:4
当前Array的第4个元素符合条件,它的下标索引是3,当前的$就是3.通过“.索引”方式取值时,一定要用双引号包裹。如"字段.索引位置"
(4).删 remove
db.tablename.remove({查询条件}) #删 如果查询条件为空,则删除所有数据 危险! #官方推荐: db.tablename.removeOne({}) # 删除符合条件的第一条数据 db.tablename.removeMany({}) # 删除所有符合条件的数据
7.选取 跳过 排序
(1).排序
db.tablename.find({}).sort({age:1}) # age是字段,是个列表,里面有字典,键为age,值为1,2,3,4等数字。 1代表递增(从小到大)-1代表降序
(2).跳过
db.tablename.find({}).skip(2) #跳过两条 前面两条
(3).选取
db.tablename.find({}).limit(5) #选5条 0、1、2、3、4------》如果数据条目大于全部数据,就全部查询
(4).例子
db.tablename.find({}).skip(2).limit(4) #跳过两条选4条
sort和skip、limit三者顺序不管怎么组合,都是先排序,再跳过,最后选取。
(5)应用:分页(每页两条数据)
page sort skip limit 1 1 0 2 2 1 2 2 3 1 4 2 4 1 6 2 count = 2 page = 1 skip((page-1)*count) #跳过的页数 db.user.find({}).sort({age:-1}).skip((page-1)*count).limit(count)
8.python操作mongodb
pymongo
from pymongo import MongoClient MC=MongoClient('127.0.0.1',27017) #创建连接 即创建mongodb客户端 db=MC['db10'] #选择或者创建数据库(在内存) -----》use player_info={ 'nickname':'yq', 'age':10, 'year':1998, 'height':178, 'hobby':[{ 'name':'basketball', 'when':14, }, { 'name':'book', 'when':23 } ] }
# 增加数据 db.player.insert_one(player_info)
查询数据:
(1).find({})
res=db.player.find({}) print(res) #<pymongo.cursor.Cursor object at 000002363EA630F0> 可遍历 print(res.inserted_id,type(res.inserted_id)) #当前新增数据的id for i in res: print(i)
(2).find_one({})
res=db.player.find_one({}) #查询符合条件的第一条是数据 res=db.player.find_one({'nickname':'ys','height':{'$gt':167}}) print(res)
(3)更新数据 update
res=db.player.update_one({'nickname':'yq'},{'$set':{'year':1978}}) print(res) res=db.player.update_many({},{'$inc':{'height':10}}) #给身高都增加10
(4)删除数据
res=db.player.delete_one({"_id":'5e546fa5c3147e1517073b03'}) #这样删不掉---》这个id不是字符串 from bson.objectid import ObjectId res=db.player.delete_one({"_id":ObjectId('5e546fa5c3147e1517073b03')}) print(res.deleted_count) #0代表没有删除
(5)ObjectId不能被JSON序列化,要先转化 ----》pickle不确定
res=db.player.find_one({'nickname':'ys','height':{'$gt':167}}) #转换id res['_id']=str(res.get('_id')) #转化为字符串 res_json=json.dumps(res) print(res_json) #Object of type 'ObjectId' is not JSON serializable. 要将id转换下
#排序 跳过 选取
from pymongo import ASCENDING,DESCENDING res=db.player.find({}).limit(2).skip(1).sort('age',ASCENDING) for i in res: print(i)
9.flask和Mongodb
flask接收到数据,数据是字典形式的,直接将字典存到MongoDb数据库中。
app应用中:
from flask import Flask, request, render_template, jsonify from setting import MongoDb 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() res=MongoDb.user.insert_one(user_info) #直接把字典存在数据库user表中(没有user表就新建) if res.inserted_id: 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() user_info_dict=MongoDb.user.find_one(user_info) user_info_dict['_id']=str(user_info_dict['_id']) #先把bson的id转化下成字符串 return jsonify(user_info_dict) if __name__ == '__main__': app.run()
在settings.py文件中,使用数据库
from pymongo import MongoClient MC=MongoClient('127.0.0.1',27017) MongoDb=MC['db11']
10.$or $and $all $in
#并列条件 $and "$and":[{},{},{}] res=list(MongoDB.user.find({"name":"ys","age":15})) print(res[0]) res=list(MongoDB.user.find("$and":[{"name":"ys"},{"age":15}])) #list()表示把查询出来的结果放在列表中,好取 #或条件 $or res=MongoDB.user.find("$or":[{"name":"ys"},{"age":15}]) $all $in针对Array操作 $in:包含 res=MongoDB.user.find("name":{"$in":[111,222,333]}) #name中有111或者222或者333的都被查出来 $all----->自己查询---》后面条件是前面的子集
Mongodb小概念
Mysql : DataBase ---->Tables ---->Column Row
MongoDB DataBase Collections Field Documents
危险操作
MongoDB.user.drop() #删除表---》没有确认,直接删除 MongoDB.dropDatabase() #删除数据库,也没有确认,直接删除 一般删除前要先复制