zoukankan      html  css  js  c++  java
  • MongoDB

    1Mongo基础概念

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

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

    操作简单方便易懂 更加接近程序员操作 原生语法ORM
    因为是非关系型数据库,没有结构限制,扩展性很强

    安装MongoDB

    配置环境变量 - Path :MongoDB/bin
    CMD -
    mongod 启动命令
        --dbpath 数据库存放路径(数据库存放路径必须存在)

       因为是临时修改的,记得每次打开时 修改   dbpath
    27017 MongoDB的默认端口
    mongo 开启客户端 默认连接地址是本机

    2增删改查

    基本操作指令: 

    db -- 当前使用的数据库 查看名称,代指当前使用的数据库
    show databases -- 查看当前服务器磁盘上的所有数据库
    use dbname -- 切换当前使用的数据库 或者在内存中创建一个新的数据库 赋值给 db
    show tables -- 查看当前数据库中所有磁盘中的表
    db.tablename -- 使用当前数据库中的tablename表 在内存中创建表

    使用不存在的对象即创建该对象

    初级版:

      增 db.tablename.insert({name:
    "123"}) #在磁盘中写入数据{name:"123"} db.tablename.insert([{name:"123"},{name:"123"}]) #在磁盘中写入多条数据 查 db.tablename.find({查询条件}) # 查询所有符合条件的数据 db.tablename.find({name:"345"}) # 查询符合{name:"345"}的所有数据 改 db.tablename.update({查询条件},{$修改器:{修改属性}}) # 根据查询条件,修改符合条件的第一条数据 修改器:认定当前修改的类型 $set设置类型修改器 强制修改某字段的值 db.tablename.update({name:"345"},{$set:{name:789}}) db.tablename.update({name:"123"},{$set:{gender:1}}) 符合不存在即创建的原则 删 db.tablename.remove({查询条件}) # 删除所有符合条件的数据 删除表格 - db.tablename.drop() 删除库 - db.dropDatabase()

    官方给出新的推荐增删改查版本

    官方不在推荐使用insert了
    db.tablename.insert({name:"123"}) #在磁盘中写入数据{name:"123"}
    db.tablename.insert([{name:"123"},{name:"123"}]) #在磁盘中写入多条数据

    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:"345"}) # 查询符合{name:"345"}的所有数据

    官方在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({查询条件}) # 删除所有符合条件的数据

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



    insertMany   insertOne

    find   findOne

    updateOne   updateMany

    3MongoDB 数据类型

    MongoDB 之 丰富多彩的数据类型世界
    
    首先我们要先了解一下MongoDB中有什么样的数据类型:
    
    Object  ID :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类型,时间戳可以秒杀一切时间类型)
    

    Object ID

    "_id" : ObjectId("5b151f8536409809ab2e6b26")
    
    #"5b151f85" 代指的是时间戳,这条数据的产生时间
    #"364098" 代指某台机器的机器码,存储这条数据时的机器编号
    #"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
    #"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
    #以上四种标识符拼凑成世界上唯一的ObjectID
    #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
    #可以得到以上四种信息
    
    #注意:这个类型是不可以被JSON序列化的

    这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:

    0-8字节是时间戳,

    9-14字节的机器标识符,表示MongoDB实例所在机器的不同;

    15-18字节的进程id,表示相同机器的不同MongoDB进程。

    19-24字节是计数器

    其他的较为常见  可参考网上资料

     4$关键字     $修饰器

    1$数学比较符

    $lt 小于
    $lte 小于等于
    $gt 大于
    $gte 大于等于
    $eq : 等于
    $ne 不等于

    2 修改器

    $修改器 + $ 字符特殊用法
        针对单个字段的操作:
        $set 修改某个字段的值 db.stu.update({age:20},{$set:{name:"绿绿",gender:1}})
    $unset 删除字段 db.stu.update({name:
    "小黑"},{ $unset: { newField:1 } })
    $inc 引用增加 先引用 后增加 db.stu.update({},{$inc:{age:
    -1}}) 针对 Array == list 操作 $push == append() 在Array的最后一个位置中增加数据 db.stu.update({name:"小黑"},{ $push: { hoobys:"渣男" } }) $pushAll == extend() db.stu.update({name:"小黑"}, {$pushAll: {"hoobys":[1,2,3,5]}}, ) $pullAll db.stu.update({name:"小黑"}, {$pullAll: {"hoobys":[1,2,3,5]}}, ) $pull == remove() 删除Array中的指定元素 db.stu.update({name:"小黑"},{ $pull: { hoobys:"渣男" } }) $pop (=) pop() 删除Array中的第一个或者最后一个元素 正数是倒序删除 负数是正序删除 db.stu.update({name:"小黑"},{ $pop: { hoobys:1 } })

    在MongoDB中有一个非常神奇的符号 "$"

    "$"  在 update 中 加上关键字 就 变成了 修改器

    其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符

    $ 字符特殊用法
        存储当前(Array)符合条件的元素下标索引 ,只能存储最外层的 索引位置 
        例子:hobbys中等于5的元素改为 "" 
        先查询到hobbys中5的 位置(2) ,将位置存储在 $==(2) 字符中 然后根据$字符的位置(2)更改数据
        
      db.stu.update({"hoobys":5},{ $set: {"hoobys.$":""} })
    
    
      db.info.updateMany({name:"xiaohei",'hobbys':2},{$set:{'hobbys.$':"er"}})
    
    
    
        Object操作:
        db.stu.update({name:"小黑"},{ $set: { "hobby.烫头":"锡纸" } })
        
        Array + Object

      注意 混合使用。。。。。。

    5查询关键字

    查询关键字
        并列查询         $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:["绿绿","黑黑","小红","小黑"]}})

    6排序 + 选取 + 跳过

    排序 + 选取 + 跳过
    排序:sort 
    db.stu.find().sort({ age:1 }) 1正序 -1倒序
    
    选取:limit
    db.stu.find().limit(2) 选取两条数据
    
    跳过:skip
    db.stu.find().skip(2) 跳过前两条数据
    
    选择中间两条 or 跳过前N条
    db.stu.find().skip(0).limit(2).sort({ age:-1 })
    
    先排序 - 跳过 - 选取
    var page = 1
    var num = 2
    var sk = (page-1) * num
    db.stu.find().skip(sk).limit(num).sort({ age:-1 })

    7Python 操作 MongoDB

    pip install pymongo

    # 导入模块
    import json
    
    from bson import ObjectId
    from pymongo import MongoClient
    
    from pymongo.cursor import  Cursor
    
    my_client = MongoClient("127.0.0.1", 27017)
    mdb = my_client["mytest"]
    
    # 增
    # 增加数据时,res.instered_id   和res.instered_ids   都是ObjectId   不是字符串
    # res=mdb.user.insert_one({"name":"xiaobai"})
    # print(res.inserted_id)
    # 5d2f2422f5d5468171fb83db
    
    # res=mdb.user.insert_many([{"name":"aaa","age":12},{"name":"bbb","age":13}])
    # print(res.inserted_ids)
    
    # [ObjectId('5d2f28a92f14a218331d8757'), ObjectId('5d2f28a92f14a218331d8758')]
    
    # 查
    
    # 转化为json 字符串
    # 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)
    
    
    # 转化为json 字符串 方法二
    # res=list(mdb.user.find({}))
    #
    # for index,user in enumerate(res):
    #     res[index]["_id"]=str(user["_id"])
    # res_json=json.dumps(res)
    # print(res_json)
    
    # res=mdb.user.find_one({"name":"aaa"})
    # print(res)
    # res=mdb.user.find_one({"_id":ObjectId('5d2f266f67b7974956dd0f6c')})
    #
    # res["_id"]=str(res.get("_id"))
    # # print(res,str(res.get("_id")))
    # res_json=json.dumps(res)
    # print(res_json)
    
    # 改
    # res=mdb.user.update_one({"name":"aaa"},{"$set":{"name":"AAA"}})
    # print(res)
    # print(res.modified_count)
    
    # user=mdb.user.find_one({"name":"AAA"})
    # user["gender"]="male"
    # user["age"]=11
    # user["hobby"]=["football","basktball"]
    # res=mdb.user.update_one({"name":"AAA"},{"$set":user})
    
    # user1 = mdb.user.find_one({"name": "AAA"})
    # # user1["hobby"].append("pingpang")
    # # user1["hobby"].remove("football")
    # # res=mdb.user.update_one({"name":"AAA"},{"$set":user1})
    # res=mdb.user.update_one({"name":"AAA"},{"$set":{"hobby":user1.get("hobby")}})
    
    # 删
    # res=mdb.user.delete_one({"name":"xiaohong"})
    # print(res.deleted_count)
    
    
    # list   skip    limit
    import pymongo
    # res=list(mdb.user.find().sort("age",pymongo.DESCENDING))
    # res=list(mdb.user.find().skip(2))
    # res=list(mdb.user.find().limit(2))
    
    
    # res=mdb.user.find({}).sort("age",pymongo.DESCENDING).skip(2).limit(3)
    #
    # for user in res:
    #     print(user)
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/XLHIT/p/11203658.html
Copyright © 2011-2022 走看看