• Mongodb


    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库。

    它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等**关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念**

    MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦

    优势: 由于数据保存在单一文件中,数据库的部署和发布都比较简单,适用于内嵌在应用程序中。

    数据量不是太大时,速度比传统数据库要快。

    缺点: 由于数据保存在单一文件中,数据库打开时,该文件会被整个load到内存,因此数据库不能过大(100M以内,个人测试)。

    MongoDB的数据结构
    User:
    [
        {id:1,name:"蔡文姬",age:16,gender:""},
        {id:2,name:"嫦娥",age:16,gender:""},
        {
            id:3,
            name:"孙悟空",
            age:16,
            gender:""
        },
        {
            id:"",
            name:123,
            age:"十六",
            gender:1,
            hobby:["篮球","于谦","羽毛球","双色球”]
        }
    ]
    #操作简单方便易懂 更加接近程序员操作 原生语法ORM
    #因为是非关系型数据库,没有结构限制,扩展性很强 

    MongoDB的安装

    1 配置环境变量 - Path :MongoDB/bin/mongod.exe
    2 CMD - 
    3     mongod 启动命令
    4         --dbpath 数据库存放路径(数据库存放路径必须存在)
    5         27017 MongoDB的默认端口
    6     mongo 开启客户端 默认连接地址是本机
    7       

    基本操作命令

    1 db    #当前使用的数据库查看名称,代指当前使用的数据库
    2 show databases    #查看当前服务器磁盘上的所有的数据库
    3 use dbname     #切换当前使用的数据库或者在内存中创建一个新的数据库赋值给db
    4 show tables    #查看当前数据库中所有磁盘中的表
    5 db.tablename   #使用当前数据库中的tablename表 在内存中创建表
    6 
    7 ##使用不存在的对象即创建该对象
    增删改查(附件官方推荐的版本3.2的用法)
    增:
    db.tablename.insert({name:123})  
    db.tablename.insert([{name:'123'},{name:'456'}])

    3.2版本
    insertedId = db.stu.insertOne({name:"666"})
    insertedIds = db.stu.insertMany([{name:777},{name:999}])
    # insertedId 是增加数据的_id ObjectId
    # insertedIds 是增加数据的_id ObjectId 列表 [ObjectId(),ObjectId()]
    db.tablename.find({查询条件})    #查询所有符合条件的数据
    db.tablename.find({name:'789'})

    官方在3.2版本中加入了新的写法
    json = db.tablename.findOne({查询条件}) # 查询符合条件的第一条数据
    db.tablename.update({查询条件},{$修改器:{修改属性}})
    # 根据查询条件,修改符合条件的第一条数据
    修改器:认定当前修改的类型 $set设置类型修改器 强制修改某字段的值
    db.tablename.update({name:"345"},{$set:{name:789}})
    db.tablename.update({name:"123"},{$set:{gender:1}}) 符合不存在即创建的原则


    3.2
    db.tablename.updateOne({name:"345"},{$set:{name:789}}) #根据查询条件,修改符合条件的第一条数据
    db.tablename.updateMany({name:"345"},{$set:{name:789}})#根据查询条件,修改所有符合条件的数据
    db.tablename.remove({查询条件}) # 删除所有符合条件的数据

    #慎用
    db.tablename.drop()
    db.dropDatabase()
    3.2
    db.tablename.deleteOne() # 删除符合条件的第一条数据
    db.tablename.deleteMany() # 删除所有符合条件的数据

    MongoDB的数据类型

    MYSQL       MongoDB             口语
    database database 数据库
    tables Collections 表儿
    column Field
    row Document 数据 一条数据
    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类型,时间戳可以秒杀一切时间类型)

     

    数学比较符
        $lt     #小于
    $lte #小于等于
    $gt #大于
    $gte #大于等于
    $eq : #等于
    $ne #不等于
    例:    
    db.tablename.find({age:{$gt:20}})    

    $修改器+$字符的特殊用法

    针对单个字段的操作:
    $set修改某个字段的值
    db.stu.update({age:20},{$set:{name:'Tom',gender:1}})

    $unset 删除字段
    db.stu.update({name:'env'},{$unset:{newfield:1}})

    $inc 引用增加,先引用后增加
    db.stu.update({name:'Tom'},{$inc:{age:-1}})  #age减1

    针对Array=list操作

    push 增加
    $push   #和append()作用一样
    db.stu.update({name:'TOM'},{$push:{hobby:'play'}})  

    $pushAll  #和extend()作用一样
    db.stu.update({name:"小黑"},
    {$pushAll: {"hoobys":[1,2,3,5]}},
    )
    pull 删除
        $pullAll 
    db.stu.update({name:"小黑"},
    {$pullAll: {"hoobys":[1,2,3,5]}},
    )

    $pull == remove()
    删除Array中的指定元素
    db.stu.update({name:"小黑"},{ $pull: { hoobys:"渣男" } })
    pop 删除
        $pop (=) pop()
    删除Array中的第一个或者最后一个元素 正数是倒序删除 负数是正序删除
    db.stu.update({name:"小黑"},{ $pop: { hoobys:1 } })

    $字符的特殊用法

    # 存储当前(Array)符合条件的元素下标索引 ,只能存储最外层的 索引位置 

    例子:hobbys中等于5的元素改为 "五"
    先查询到hobbys中5的 位置(2) ,将位置存储在 $==(2) 字符中 然后根据$字符的位置(2)更改数据

    db.stu.update({'hobby':5},{$set:{'hobby.$':'五'}})

    #如果不用$符号确定索引,就会将整个hobby列表清空,并设置为'五'

    Object操作

        db.stu.update({name:"小黑"},{ $set: { "hobby.烫头":"锡纸" } })

    Array + Object
    #

    查询关键字

    并列查询 $and
        db.tablename.find({name:"345",age:1})
    db.stu.find({$and: [{name:"绿绿"},{age:20}]})
    或查询 $or
    db.stu.find({$or:[{name:"绿绿"},{name:"小黑"}]})
    子集查询 $all
    db.stu.find({"user_list":{$all:["dashabi","alex"]}})
    范围查询 $in
    ["绿绿","黑黑","红红","小黑"]
    db.stu.find({name:{$in:["绿绿","黑黑","小红","小黑"]}})

    排序 sort

    db.stu.find().sort({ age:1 }) 1正序 -1倒序

    选取 limit

    db.stu.find().limit(2) 选取两条数据

    跳过 skip

    db.stu.find().skip(2) 跳过前两条数据
    分页操作
    先排序 - 跳过 - 选取   #系统默认的执行顺序
    var page = 1
    var num = 2
    var sk = (page-1) * num
    db.stu.find().skip(sk).limit(num).sort({ age:-1 })

    Python操作MongoDB

    下载
    pip3 install pymongo
    导入
    from pymongo import MongoClient
    与MongoDB建立连接
    m_client=MongoClient('127.0.0.1',27017)
    db=my_client['PK']
    # 增加数据时 res.inserted_id or inserted_ids
    # 都是 ObjectId不是字符串
    res = mdb.user.insert_one({"name":"DragonFire"})
    print(res.inserted_id)  # 5d2ed8f865d6b8f1c494ff78
    res = mdb.user.insert_many([{"name":"小黑"},{"name":"小二B"}])
    print(res.inserted_ids)
    #通过ObjectId查找需要导入 ObjectId 模块
    from bson import ObjectId

    res = mdb.user.find_one({"name":"小黑"})
    res = mdb.user.find_one({"_id":ObjectId("5d2ed96e38887b85450ed6d8")})
    res["_id"] = str(res.get("_id"))
    print(res,str(res.get("_id")))
    res_json = json.dumps(res)
    print(res_json)

     

    #将数据库的数据转换成json字符串,但是objectID不能转换,所以就需要进行数据类型的转化
    #方法一: 在新建一个列表,但是会加大内存负担
    res = list(mdb.user.find({}))
    print(res)
    res_list = []

    for user in res:
       user["_id"] = str(user.get("_id"))
       res_list.append(user)

    res_json = json.dumps(res_list)
    print(res_json)

    #方法二:直接在原本列表删修改,节省了内存
    res = list(mdb.user.find({}))
    print(res)

    for index,user in enumerate(res):
       res[index]["_id"] = str(user.get("_id"))

    res_json = json.dumps(res)
    print(res_json)
    res = mdb.user.update_one({"name":"小二B"},{"$set":{"name":"A_C"}})
    print(res.modified_count)

    user = mdb.user.find_one({"name":"A_C"})
    user["gender"] = 1
    user["age"] = 99
    user["name"] = "小二A_C"
    user["hobby"] = ["choyan","hj","xzt"]

    res = mdb.user.update_one({"name":"A_C"},{"$set":user})  #直接重写对象,推荐方便.

    user = mdb.user.find_one({"name":"小二A_C"})
    user["hobby"].append("洗头")
    user["hobby"].remove("hj")

    mdb.user.update_one({"name":"小二A_C"},{"$set":{"hobby":user.get("hobby")}})
    res = mdb.user.delete_one({})
    print(res.deleted_count)
    排序
    要导入pymongo
    import pymogo

    # 排序 + skip + limit
    res = list(mdb.stu.find().sort("age",pymongo.DESCENDING)) #倒序
    res = list(mdb.stu.find().skip(2))
    res = list(mdb.stu.find().limit(2))
    for s in res:
       print(s)
    分页
    # 分页
    res = list(mdb.stu.find().sort("age",pymongo.ASCENDING).limit(2).skip(4))
    print(res)

     

    清风徐来.水波不兴
  • 相关阅读:
    Http无状态协议
    API
    在IE里嵌入播放器
    ASP.NET中常用的优化性能方法(转)
    分布式应用程序
    VS2007的beta版下载地址
    组合还是继承(转)
    您不能初始化一个远程桌面连接,因为在远程计算机上的windows登录软件被不兼容的软件取代
    .Net平台开发的技术规范与实践精华总结(转)
    什么是“分布式应用系统”
  • 原文地址:https://www.cnblogs.com/ghl666/p/11941467.html
Copyright © 2020-2023  润新知