返回顶部

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"]

 

posted @ 2020-10-30 23:18  muguangrui  阅读(140)  评论(0编辑  收藏  举报