zoukankan      html  css  js  c++  java
  • MongoDB

    1.定义

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

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

    可以理解为

    它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等

    关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念

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

     

    2.安装

    安装完成之后,开始进入配置环节,首先我们要进入目录:

    "C:Program FilesMongoDBServer3.4in"

    带着你配置环境变量,让X装的更加自然更加美:

    之后的操作,windows 7 与 windows 10 不太一样,大同小异啦

    windows 10 一路到底的"确定"

    windows 7 在这里需要注意的是,Path路径移动到最后,输入:" ;C:Program FilesMongoDBServer3.4in " 一定要带上 " ; " 哦

    因为没有找到windows 7 操作系统的计算机,所以这里只能给windows 7 的同学说声抱歉了

    OK!到了这里我们基本已经完成了部分操作了

    我们来试一下成果吧

    打开cmd窗口进行一次ZB的操作吧

    那我们来创建一个" C:datadb "的目录吧

    好了目录已经有了,再次ZB试一下

    好了开启成功了

    那么服务开启了,客户端怎么去连接呢,这时我们需要另一个cmd窗口开启mongo的客户端

    到此,我们成功的完成了,服务端的部署开启,还有客户端的链接,如果你还想继续往下学习的话,我给你一句金玉良言

    千万别把这两个cmd窗口关了,不然你还得重新打开一次

     

    3.基本命令

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

    查看有多少个数据库
    show dbs
    查看当前正在使用数据库
    db
    #test是测试数据库
    切换(创建)数据库(如果没有会默认创建,但是是创建在内存上,如果写入了数据,数据库就存到磁盘上了)
    use locals
    创建一张表
    db.user
    插入一条数据(此时数据库和表才会到磁盘上)
    db.user.insert({})
    查看当前数据库存在磁盘上的数据表
    show tables

    4.数据增删改查

    (1).mysql与mongodb的比较

     

    这样的数据在mongodb中存储(存储json的数据结构)

    [{
        "id":1,
        "name":"jwb",
        "age":73,
    },
    {
        "id":2,
        "name":"ywb",
        "age":84,
    }]

    特殊之处

    [{
        "id":1,
        "name":"jwb",
        "age":73,
        "hobby":[1,2],#可以存列表
        "duixiang":{    #相当于跨表
            "id":2,
            "name":"ywb",
            "age":84,
        }
    },
    {
        "id":2,
        "name":"ywb",
        "age":84,
        "duixiang":{
            "id":1,
            "name":"jwb",
            "age":73,
        },
        #hobby为空可以不写
    }]

    mysql与mongodb的区别

    mysql            mongodb
    数据库                数据库
    表                  collections
    列                 Field
    row                  documents

    (2).增删改查

    语法
    库.表.增/删/改/查

    增 insert

    db.user.insert({"id":1,"name":"jwb","age":73})
    db.user.insert([{"id":1,"name":"jwb","age":73},{"id":2,"name":"jwb","age":73}] 相当于 db.user.insertMany()
    
    官方推荐(效率更高)
    插入一条用:db.user.insert({})
    插入多条用:db.user.insertOne([{},{}])

    查 find

    db.user.find({})  #查所有
    db.user.find_one({})  #查所有符合条件的数据中的一条
    db.user.find({'id':2,"age":85})  #并列条件
    
    $or  #或条件
    db.user.find({$or:[{'id':2},{"age":73}]})
    
    $in   #子集,相当于同意字段的或
    db.user.find('age':{$in:[73,84,86]})
    db.user.find('age':{$in:[1,3,5,8]})  #字段是它的自子集或完全自己都可以
    
    $all   #必须满足所有条件
    db.user.find('age':{$all:[1,3,5,8]})  #[1,3]就检索不出来了

    改 update

    db.user.update({"age":73},{$set:{"age":84}}) #将年龄为73的改为84
    db.user.update({"age":84},{$set:{"username":"jinjiaodawangba"}}) #将年龄为84的字段的username改为jinjiaodawangba,如果username不存在,则创建
    
    官方推荐
    db.user.updateOne({},{$set:{}})  #更新所有符合条件的数据的第一条
    db.user.updateMany({},{$set:{}})  #更新所有符合条件的数据

    删 remove

    db.user.remove({"age":85})  #删除年龄为85的数据
    
    官方推荐 
    db.user.deleteOne({'name':"jwb})  #删除所有符合条件的数据的第一条
    db.user.deleteMany({'name':"jwb})  #删除所有符合条件的数据
    清空所有数
    db.user.deleteMany() 
    修改器

    (1)$修改器

    $set:暴力修改
    
    $inc:引用增加
    db.user.updateMany({},{$inc:{"age":1}}) #所有人的年龄+1(在原有值的基础上+1)
    
    $unset:暴力删除字段
    db.user.updateOne({'name':"ywb"},{$unset:{"hobby":1}}) #暴力删除名字为ywb的hobby,后面的1是固定的

    (2)array修改器

    $push:增加元素
    db.user.updateOne({'name':"ywb"},{$push:{"hobby":'jwb'}})#向列表中添加一个
    
    $pull:删除元素
    db.user.updateOne({'name':"ywb"},{$pull:{"hobby":'jwb'}})#删除列表中的jwb
    
    $pushAll:迭代增加
    db.user.updateOne({'name':"ywb"},{$pullAll:{"hobby":[1,2]}})#向列表中迭代添加
    
    $pop:删除列表中的最后一条/第一条数据
    db.user.updateOne({'name':"ywb"},{$pop:{"hobby":1}})#删除列表中的最后一条数据
    db.user.updateOne({'name':"ywb"},{$pop:{"hobby":-1}})#删除列表中的第一条数据

    (3)$字符(存储符合条件的元素下标索引)

    db.user.updateOne({'hobby':'hj'},{$set:{'hobby.$':'喝酒'}})  #修改列表中的某一个,先从列表中找到hj,找到hj的所有为0,$暂为为0,只改第一个符合条件的,updateMany也是只改第一个符合条件的

    数学比较符

    $gt:大于
    db.user.find({"age":{%gt:73}})
    
    $gte:大于等于
    $lt:小于
    $lte:小于等于
    $eq:等于 

    5.数据类型

    Object  ID :Documents 自生成的 _id,与id类似,mongodb已经帮我们做好了,就不用手动写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字节是计数器

    6.array与object

    1.object操作
    (1)db.user.updateOne({"kecheng.price":'python'},{'$inc.price':500})  #将课程字典中的price在原有的基础上+500
    (2)db.user.updateOne({"kecheng.price":'python'},{'$set.price':19800})  #将课程字典中的price暴力的改成19800
    
    2.array操作
    db.user.update({"name":"路飞学城-骑士计划"},{$set:{"price.0":5000}})
    
    3.array中的object
    db.user.updateOne({hobby.name":'jwb'},{'$set':{'hobby.$.age':84}})
    
    4.object中的array
    db.user.update({"kecheng.class":15},{$set:{"kecheng.class.$":20}})
    
    5.array中的array
    db.user.update({"name":"路飞学城-骑士计划"},{$set:{"price.1.1":"d"}})
    
    6.object中的object
    db.user.update({"name":"路飞学城-骑士计划"},{$set:{"other.count":{"python":111112}}})

    7.跳过,选取,排序

    db.user.find({}).limit(2)  #只显示两条
    db.user.find({}).skip(2)   #跳过前两条
    分页
    db.user.find({}).skip(2).limit(2)   #跳过前两条,只显示两条
    
    排序
    db.user.find({}).sort({'age':-1}) #以age进行排序,-1是倒叙,1是升序
    
    排序后分页显示
    db.user.find({}).sort({'age':-1}).skip(2).limit(2)  
    
    优先级 sort>skip>limit(内置优先级)

    8.NoSQLBoolster for MongoDB(图形化工具)的使用

    9.用pymongo操作mongodb

    查所有,返回可迭代对象

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.find({})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    查符合条件中的一个,返回字典

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.find_one({},{"age":0,'name':0})
    #筛选 条件是不雅年龄和姓名为0的
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    增加,插入(一条)

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.insert_one({'id':1,"age":5,'name':'shy'})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)
    print(res.inserted_id) #获取object_id

    添加多个

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.insert_many([{'id':1,"age":5,'name':'shy'},{'id':2,"age":5,'name':'shy'}])
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)
    print(res.inserted_ids)  #获取所有object_id

    修改(只改符合条件的第一个)

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.update_one({"age":55},{"$set":{'name':'shy'}})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    修改多个

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.update_many({"age":55},{"$set":{'name':'shy'}})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    删除(只改符合条件的第一个)

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.delete_one({'id':1})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    删除

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.delete_many({'id':1})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    sort,limit,skip

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    res=MongoDB.user.find({}).limit(5).skip(2)  #跳过2个,只显示5个
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)
    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    #res=MongoDB.user.find({}).sort({'age':1})  
    #sort的用法与mongodb不同了,后面可以和limit,skip一起用
    res=MongoDB.user.find({}).sort('age':pymongo.DESCENDING)
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
        json.dumps(i)

    根据ObjectId查询时的注意

    import pymongo
    import json 
    
    mongoclient=pymongo.MongoClient(host='127.0.0.1',port=27017)
    MongoDB=mongoclient['locals']
    
    s=ObjectId('d45fsd64f5dg4f5d6g54f6')#一定要转成ObjectId类型才可以用
    
    res=MongoDB.user.find_one({'_id':s})
    
    for i in res:
        i["_id"]=str(i.get("_id"))  #将object-id转成字符串,否则不能序列化
    用户相关
    
    1、添加一个用户
    
    db.addUser(“name”);
    
    db.addUser(“userName”, “pwd123”, true); 添加用户、设置密码、是否只读
    
    2、数据库认证、安全模式
    
    db.auth(“userName”, “123123”);
    
    3、显示当前所有用户
    
    show users;
    
    4、删除用户
    
    db.removeUser(“userName”); 

    10.创建新用户

    创建新用户
    db.createUser({user:"shy",pwd:"111111",roles:[{role:"readWrite",db:"test"}]})  #用户的权限为可读可写
    
    使用新用户
     db.auth("shy","19960926abc")

  • 相关阅读:
    C#将datatable生成easyui的绑定tree 的json数据格式
    asp.net DataTable转JSON
    asp.net面试题
    windows笔记线程的一些性质
    windows笔记创建线程的另一个函数_beginthreadex
    windows笔记【内核对象线程同步】等待定时器内核对象
    windows笔记用哪个创建线程CreateThread还是_beginthread
    windows笔记【内核对象线程同步】信标内核对象
    windows笔记【内核对象线程同步】事件内核对象
    windows笔记【内核对象线程同步】等待函数
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/10400262.html
Copyright © 2011-2022 走看看