MongoDB基本应用
一.简介
官方解释:
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等。
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念。
mongodb中存的的就是JSON数据:
{ id:1, name:孙悟空, age:99999999, wq: 定海神针, ts: 紧箍 fs: 虎皮裙儿,红丝袜,长筒靴 hobby:["铁扇公主","紫霞","晶晶"] skill:[ { name:"火眼金睛", content:"透视" },{ name:"变大小", content:"变~~~~~~~~~" } ] }, { id:2, name:沙悟净, age:9999999, sp: 唐僧同款项链 } MongDB存储的就是JSON数据
1.1 基本使用
1.下载mongdb https://www.mongodb.com/try/download/community 2.基本命令: 1.show databases 查看本地磁盘中的数据库 2.use databasename 切换当前使用的数据库 3.db 查看当前使用的数据库 4.show tables 查看当前数据库磁盘中的表 注意: use 不存在的数据库名 即 在内存中创建该数据库 db.不存在的表名 即 在数据库中创建该表(内存中) 使用了不存在的对象 即 创建该对象,只有有数据变动时,才写入数据库。
1.2 数据类型
ObjectID :Documents 自生成的 _id String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Double) Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦) Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典 Null:空数据类型 , 一个特殊的概念,None Null Timestamp:时间戳 Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
注意:
关于objectID:
"_id" : ObjectId("5b151f8536409809ab2e6b26") #"5b151f85" 代指的是时间戳,这条数据的产生时间 #"364098" 代指某台机器的机器码,存储这条数据时的机器编号 #"09ab" 代指进程ID,多进程存储数据的时候,非常有用的 #"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的 #以上四种标识符拼凑成世界上唯一的ObjectID #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换 #可以得到以上四种信息 #注意:这个类型是不可以被JSON序列化的,通过json.dumps转换成字符串时,要先把objectid转换成str类型
1.3 增删改查
增:
db.tablename.insert({}) db.user.insert({name:"沙悟净",age:66.666,hobby:[1,2,3,4,5]}) db.user.insert([{},{}]) 官方推荐写法 in 3.2: db.user.insertOne({}) 增加一条数据 db.user.insertMany([{},{}]) 批量增加数据
查:
db.tablename.find({查询条件}) 查询所有符合条件的数据 db.user.find({name:"沙悟净"}) 条件查询 db.user.find({name:"沙悟净",age:77}) 并列条件查询 db.user.findOne({}) 查询符合条件的第一条数据 返回JSON数据 $数据比较符 $lt 小于 $lte 小于等于 $gt 大于 # db.t1.find({age:{$gt:10}}) $gte 大于等于 $eq 等于 $ne 不等于
改:
db.tablename.update() 修改符合条件的第一条数据 # 所有MongoDB的修改全部基于 修改器 # $修改器 关键字 # $关键字: db.user.updateOne({name:"太白金星","stdent.name":"MPy"},{$set:{"stdent.$.name":"Anyway"}}) # stdent是一个Object类型 db.user.updateOne({name:"太白金星",hobby:"喝酒"},{$set:{"hobby.$":"飙车"}}) # hobby是一个Array $是用来存储符合当前Array条件元素的下标索引 当前Array - ["抽烟","喝酒","剃头"] 条件元素 - {hobby:"喝酒"} 当前Array - 第2个元素符合条件 它的下表索引是 1 当前$ 的值就是 1 如果使用".索引"的方式来操作Array "字段.索引位置" 官方推荐 db.user.updateOne({},{}) 修改符合条件的第一条数据 db.user.updateMany({},{}) 修改符合条件的所有数据 $set db.user.update({age:66.666},{$set:{age:44}}) 强制的将某字段值修改 db.user.update({name:"孙大圣"},{$set:{ag18e:18}}) 如果该字段不存在即创建该字段并赋值 $unset db.user.update({name:"孙大圣"},{$unset:{ag18e:1}}) 删除字段 $inc db.user.update({name:"孙大圣"},{$inc:{age:1}}) 引用增加 先引用原有数据 在原有数据基础上增加 db.user.update({name:"孙大圣"},{$inc:{age:-1}}) 减少 针对 Array List操作 $push == append db.user.update({name:"孙大圣"},{$push:{hobby:"8"}}) 在Array类型中增加数据在最末端增加 $pushAll == extends db.user.update({name:"孙大圣"},{$pushAll:{hobby:[9,10,11,12]}}) 在Array类型中增加数据在最末端增加多条数据 $pull == remove() db.user.update({name:"孙大圣"},{$pull:{hobby:"8"}}) 删除所有符合条件的数据 $pullAll db.user.update({name:"孙大圣"},{$pushAll:{hobby:[9,10,11,12]}}) 遍历删除所有符合条件的数据 $pop ~= pop() 删除Array中第一条或最后一条 db.user.update({name:"孙大圣"},{$pop:{hobby:-1}}) 删除第一个数据 db.user.update({name:"孙大圣"},{$pop:{hobby:1}}) 删除最后一个数据
删:
db.tablename.remove({查询条件}) 删除符合条件的所有数据
db.user.remove({}) 如果条件为空则删除所有数据 危险!
官方推荐的写法:
db.user.deleteOne({}) # 删除符合条件的第一条数据
db.user.deleteMany({}) # 删除所有符合条件的数据 危险! 如果条件为空则删除所有数据
总结:
1.增: db.tablename.insert({name:123}) 官方认可但不推荐 res = db.tablename.insertOne({name:123}) # 增加一条数据 inserted_id res = db.tablename.insertMany([{name:123},{name:456}]) # 增加多条数据 inserted_ids 2.删除数据: db.tablename.remove({查询条件}) #官方认可但不推荐 db.tablename.deleteOne({查询条件}) # 删除符合条件的第一条数据 _id db.tablename.deleteMany({查询条件})# 删除所有符合条件的数据 3.查询数据: db.tablename.find({查询条件}) # 查询所有符合条件的数据 db.tablename.findOne({查询条件}) # 查询符合条件的第一条数据 并列条件查询 and db.tablename.find({查询条件1,查询条件2}) $比较符: $lt < $lte <= $gt > $gte >= $eq == $ne != 4.修改数据 db.tablename.update({查询条件},{$修改器:{修改值}}) # 官方认可但不推荐 db.tablename.updateOne({查询条件},{$修改器:{修改值}}) # 修改符合条件的第一条数据 db.tablename.updateMany({查询条件},{$修改器:{修改值}}) # 修改所有符合条件的数据 $修改器 字段: $set 强制修改 创建字段 $unset 删除字段 {字段:1} $inc 引用增加 {$inc:{age:1/-1}} 只能增加不能减少 $修改器 Array List $push == append #追加数据 {$push:{hobby:6}} $pull == remove #删除元素 {$pull:{hobby:6}} $pop ~= pop #删除第一个(1)或者最后一个元素(-1) {$pop:{hobby:1/-1}} $pushAll == extends #追加批量元素 {$pushAll:{hobby:[4,5,6,7]}} $pullAll # 批量删除元素 {$pullAll:{hobby:[4,5,6,7]}}
1.4 选取,跳过,排序
排序 db.user.find({}).sort({age:-1}) 倒序 db.user.find({}).sort({age:1}) 正序 跳过 db.user.find({}).skip(跳过条目) 跳过 选取 db.user.find({}).limit(300) 选取300条数据 如果数据条目小于300 则全部查询 大于300 则只查询300条 db.user.find({}).sort({age:-1}).skip(1).limit(2) 当3个关键全部出现在一条语句中时,先排序 再跳过 再选取 分页(每页2条数据): # mongodb实现一个分页是不是很简单。 count = 2 # 每页显示条目 page = 1 # 页码 skip(page-1*count) db.user.find({}).sort({age:-1}).skip(page-1*count).limit(count)
二. Pymongo基本使用
pip3 install pymongo
2.1 基本使用
from pymongo import MongoClient MC = MongoClient('127.0.0.1', 27017) db = MC['crm'] info = { "name": "maomao", "age": 18, "email": "871347265@qq.com", "hobby": ["study", "python", "Computer Games"] }
################################# 增加数据
db.t1.insert_one(info)
db.t1.insert_many([info])
################################# 查询数据
res = db.t1.find({})
print(res) # <pymongo.cursor.Cursor object at 0x00000205C4D39130>
# 需要通过for循环取值
for i in res:
print(i)
res = db.t1.find_one({"name":"maomao"})
print(res)
res = db.t1.find_one({"name":"maomao","age":{"$gt":10}})
print(res) # 可以省略for这一步
# ################################更新数据
res = db.t1.update_one({"name":"maomao"},{"$set":{"age":25}})
res = db.t1.update_many({},{"$inc":{"age":20}})
# ObjectId("5f9c1b459b8ad7e619cede25")
# ################################删除数据
from bson.objectid import ObjectId
res = db.t1.delete_one({"_id":ObjectId("5f9c1b459b8ad7e619cede25")})
print(res.deleted_count)
# objectID不能被JSON序列化的,只能手动转换成字符串类型
res = db.t1.find_one({"name":"maomao"})
res['_id'] = str(res.get("_id"))
res_json = json.dumps(res)
print(res_json)
# ###############################排序 跳过 选取
from pymongo import ASCENDING,DESCENDING
res = db.t1.find({}).limit(1).skip(1).sort("_id",DESCENDING)
for i in res:
print(i)
2.2 结合flask的小应用
from flask import Flask,request,render_template,jsonify from setting import MongoDB app = Flask(__name__) app.debug = True @app.route('/reg',methods=['GET','POST']) def reg(): if request.method == "GET": return render_template('reg.html') else: # print("request.form:", request.form) print("form_to_dict:", request.form.to_dict()) user_info = request.form.to_dict() res = MongoDB.t1.insert_one(user_info) # user_info直接就是一个字典,通过mongodb的insert方法直接存入,注意pymongo的语法,有一个下划线。 if res.inserted_id: return '注册成功' else: return '注册失败' @app.route('/login',methods=['GET','POST']) def login(): if request.method == "GET": return render_template('login.html') else: user_info = request.form.to_dict() user_info_dict = MongoDB.t1.find_one(user_info) user_info_dict["_id"] = str(user_info_dict["_id"]) return jsonify(user_info_dict) if __name__ == '__main__': app.run()
setting:
from pymongo import MongoClient MC = MongoClient("127.0.0.1",27017) MongoDB = MC["crm"]