zoukankan      html  css  js  c++  java
  • 29.mongodb学习

    Mongdb:

    https://www.cnblogs.com/DragonFire/p/9135630.html

    MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community

    准备:
    启动Mongdb
    mongdb --dbpath "数据库目录"
    默认端口 27017
    show dbs 查看当前存在磁盘上的数据库
    show tables 查看当前数据库存在磁盘上的数据表
    use 数据库 创建数据库或切换数据库
    
    使用了不能存在的对象即创建该对象
    数据库.表明 创建表
    
    mongdb:
    [
        {"id":1,name:"jwb", "age": 12, "hobby":["fad",'fda']},
        {"id":2,name:"jwb", "age": 33, "duixiang":{"id":2, "name": "alex", "age": 89}},
    ]
    
    mysql: 数据库   表          列     row
    mongdb: 数据库 collections Field documents
      
    安装:nosqlboosterformongdb
    

    数据增删改查:

    https://www.cnblogs.com/DragonFire/p/9135638.html

    show dbs 查看当前存在磁盘上的数据库
    show tables 查看当前数据库存在磁盘上的数据表
    use 数据库 创建数据库或切换数据库
    db.user  创建表
    db  查看当前数据库
    ---------------------------------------------------------------------------------------
    # 增加 
    insert  # 不推荐
    db.user.insert({"id":1,name:"jwb", "age": 12})  #增加
    insertOne  # 官方推荐
    db.user.insertOne({"name":"dd","age":21})
    {
            "acknowledged" : true,
            "insertedId" : ObjectId("5e1d2fd77d4a5d11d2853baa")
    }
    inserMany  # 官方推荐
    --------------------------------------------------------------------------------------
    # 查询
    find  # 直接查询全部
    findOne # 查询其中的一条
    find() 无条件查找:将该表(Collection)中所有的数据一次性返回
    > db.user.find({},{"_id":0})
    	{ "name" : "huahua", "age" : 20 }
        { "name" : "dd", "age" : 21 }
        { "name" : "dt", "age" : 21 }
        { "name" : "ceshi", "age" : 22 }
    > db.user.findOne({"name":"dd"},{"_id":0})
    	{ "name" : "dd", "age" : 21 }
    findOne()无条件查找一条数据,默认当前Collection中的第一条数据
    findOne({age:19}) : 条件查找一条age等于19的数据,如有多条数据则返回更靠前的数据
    --------------------------------------------------------------------------------------
    # 修改
    update # 不推荐
    > db.user.update({"name":"dd"},{$set:{"age":19}})
    	WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 匹配一条,插入零条,修改一条
    updateOne # 官方推荐
    updateOne({"age":19},{$set:{"name":"WSSB"}}) # 根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
    updateMany # 官方推荐
    updateMany({"age":19},{$set:{"name":"pig_qi"}}) # 根据条件修改所有数据的内容,多条修改
    --------------------------------------------------------------------------------------
    # 删除
    remove({}) # 无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
    > db.user.remove({"id":"1"})
    	WriteResult({ "nRemoved" : 1 })
    
    --------------------------------------------------------------------------------------
    
    db.user.find()  # 查看数据
    # { "_id" : ObjectId("5e1c29654b4190261d2230c3"), "id" : 1, "name" : "alex" }
    db.user.find({}).skip(2).limit(5)
    
    Mongodb中的跳过选取排序:
    skip(5) 跳过五条数据
    limit(5)  只显示五条数据
    分页 skip(5).limit(5)
    
    sort({age:1})  正序
    sort({age:-1})  逆序
    如果三个关键字同时出现:
    1.sort 2.skip 3.limit
    

    数据类型:

    https://www.cnblogs.com/DragonFire/p/9135854.html

    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类型,时间戳可以秒杀一切时间类型)
    

    mongodb关键字:

    1.查询中常见的 等于 大于 小于 大于等于 小于等于
    # 等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "路飞学城"
    > db.user.find({"age":21})
    
    # 大于 : 在MongoDB中的 大于 > 号 我们用 : $gt  比如 :  "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据
    > db.user.find({"age":{"$gt":20}},{"_id":0})
    { "name" : "dt", "age" : 21 }
    { "name" : "ceshi", "age" : 22 }
    
    # 小于 : 在MongoDB中的 小于 < 号 我们用 : $lt  比如 :  "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据
    > db.user.find({"age":{"$lt":20}},{"_id":0})
    { "name" : "dd", "age" : 19 }
    
    # 大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte  比如 :  "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据
    > db.user.find({"age":{"$gte":20}},{"_id":0})
    { "name" : "huahua", "age" : 20 }
    { "name" : "dt", "age" : 21 }
    
    # 小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte  比如 :  "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据
    > db.user.find({"age":{"$lte":20}},{"_id":0})
    { "name" : "huahua", "age" : 20 }
    { "name" : "dd", "age" : 19 }
    ----------------------------------------------------------------------------------------
    2.MongoDB中的那些个update修改器: $inc $set $unset $push $pull
    # $inc : Python中的  变量 += 1 , 将查询到的结果 加上某一个值 然后保存
    > db.user.update({"name":"dd"},{$inc:{"age":1}},{"_id":0})  # age+1
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.user.find({"name":"dd"})
    { "_id" : ObjectId("5e1d2fd77d4a5d11d2853baa"), "name" : "dd", "age" : 20 }
    减操作如何进行呢,加负的就是减
    > db.user.update({"name":"dd"},{$inc:{"age":-1}},{"_id":0})
    
    # $set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)了
    > db.user.update({"name":"dd"},{$set:{"sex": "femail"}})
    
    # $unset : 用来删除Key(field)的
    删除对应数据的属性,{"sex":"femail"}可以写全,也可以不写全
    > db.user.update({"name":"dd"},{$unset:{"sex":""}})
        
    # $push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法
    > db.user.update({name:"dd"},{$set:{hobby:[1,2,3,4,5]}})
    > db.user.update({name:"dd"},{$push:{hobby:6}}) 
    > db.user.update({name:"dd"},{$push:{hobby:[6]}})
    { "name" : "dd", "age" : 19, "hobby" : [ 1, 2, 3, 4, 5, [ 6 ], 6 ] } 
    这里push进入是什么类型就是什么类型
    # $pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
    db.user.update({name:"dd"},{$pull:{hobby:6}})
    db.user.update({name:"dd"},{$pull:{hobby:[6]}})
    { "name" : "dd", "age" : 19, "hobby" : [ 1, 2, 3, 4, 5 ] }
    如果有多个同种类型的相同的值,会都被删除,
    # $pop : 指定删除Array中的第一个 或 最后一个 元素
    db.user.update({name:"dd"},{$pop:{hobby:1}})  # 删除最后一个
    db.user.update({name:"dd"},{$pop:{hobby:-1}}) # 删除第一个
    

    特殊用法:

    # 还有关于mongodb中的除了bool,flaot,int,如果他是个字符串,你就把双引号加上,字段名也一样,有时候会出现各种报错
    > db.user.find({name:"dd"},{"_id":0})
    { "name" : "dd", "age" : 19, "hobby" : [ 2, 3, 4 ] }
    > db.user.update({name:"dd"},{$set:{"hobby.0":9}})  # 
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })  # 将下标第一个设置为9
    
    db.user.insert({"name":"alex","hobby":[1,2,3,4,6],"girl":["make","jj","pyyu"]})
    db.user.update({"name":"alex"},{$set:{"hobby.2":100}})  # 将第三个值改为100
    
    db.user.update({"name":"alex","hobby.1":{$lt:10}},{$inc:{"hobby.1":100}}) # 如果小于10,就加100
    
    db.user.updateOne({"name":"alex","hobby":{$lt:100}},{$inc:{"hobby.$":1}}) # 给小于100的加上1
    db.user.updateMany({"name":"alex","hobby":{$lt:100}},{$inc:{"hobby.$":1}})  # many只改第一个,需要改全部自己全部获取出来之后,重新赋值加进去
    
    db.user.update({"name":"alex"},{$set:{"girl.100":"bobo"}})  # 下标取值,赋值设置,但是如果没有值话就是创建,比如你没有下标100,girl.100,中间的下标会使用null补齐。
    
    db.user.update({name:"alex"},{$pull:{girl:"bobo"}})
    
    db.user.insert({name:"alex",price:[
        {"start":"2018-10-1",start_time:"8:30","count":100},
        {"start":"2019-12-10",start_time:"12:30","count":300},
        {"start":"2022-2-11",start_time:"1:30","count":500},
    ]})
    
    1.给count小于350的加15,这的这个price.$.count代表的意思是,前面过滤条件之后的结果,也就是这个东西:
            db.user.insert({name:"alex",price:[
                {"start":"2018-10-1",start_time:"8:30","count":100},
                {"start":"2019-12-10",start_time:"12:30","count":300},
            ]})
    > db.user.update({"name":"alex","price.count":{$lt:350}},{$inc:{"price.$.count":15}})
    2.把 count 大于 180 的 start 改为 "2018-8-10"
    db.user.update({"name":"alex","price.count":{$gt:300}},{$set:{"price.$.start":"2018-8-10"}})
    

    limit,skip,sort用法:

    limit: 
    db.user.find({}).limit(3)  # 拿出几条
    skip:
    db.user.find({}).skip(3)   # 跳过几条
    sort:
    db.user.find({}).sort({"age":1}) # 1升序,-1降序   
    # Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort  其次 Skip 最后 Limt
    

    pymongo:

    import pymongo as pymongo
    import json
    
    from bson import ObjectId
    
    mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
    
    Mongodb = mongoclient["user"]
    
    # res = Mongodb.user.find({})
    #
    # for i in res:
    #     i["_id"] = str(i["_id"])
    #     print(json.dumps(i))
    
    # 查找
    # res = Mongodb.user.find_one({}, {"_id": 0})
    # print(res)
    
    # 插入
    # res = Mongodb.user.insert_one({"id": 4, "name": "bobo"})
    # print(res, type(res), res.inserted_id)
    # res = Mongodb.user.insert_many([{"id": 6, "name": "tete"}, {"id": 5, "name": "bati"}])
    # print(res, type(res), res.inserted_ids)
    
    
    # 修改
    # res = Mongodb.user.update_one({'id': 4}, {"$set": {"name": "四氟垫"}})
    # print(res, type(res))
    #
    # res = Mongodb.user.update_many({'id': 4}, {"$set": {"name": "四氟垫"}})
    # print(res, type(res))
    
    
    # res = Mongodb.user.find({"id": 1})
    # print(res[0])
    
    # 删除
    # res = Mongodb.user.delete_one({"id": 1})
    # res = Mongodb.user.delete_many({"id": 1})
    
    # limit sort skip
    # res = list(Mongodb.user.find({}).limit(5).skip(2))
    # print(res)
    # res = list(Mongodb.user.find({}).sort("age", pymongo.DESCENDING).limit(5).skip(2))
    # print(res)
    #
    # s = ObjectId("5e1c3031e9c14a7efc87efb1")  # 字符串转换为,ObjectId
    # data = Mongodb.user.find_one({"_id": s})
    # print(data)
    
    user = {
        "1": "alex",
        "2": "make"
    }
    chat_list = []
    while True:
        user_id = input("请输入用户id:")
        string = input("请输入内容:")
        user_name = user.get(user_id)
        if string.strip():
            user_dict = {user_name: string}
            chat_list.append(user_dict)
            chat_list = json.dumps(chat_list)
    
        if not Mongodb.user.find_one({"id": user_id}):
            Mongodb.user.insert_one({"id": user_id, "chat_list": chat_list})
        else:
            print("update")
            Mongodb.user.update_one({"id": user_id}, {"$set": {"chat_list": chat_list}})
        chat_list = json.loads(chat_list)
    
    

    回顾:

    https://www.cnblogs.com/DragonFire/p/9141976.html

    MongoDB:
    mongod 启动 --dbpath  数据存储路径
    use dbname 切换或者创建数据库
    db.tablename 创建或切换当前表 -Collection
    
    增:
    不推荐
    db.tablename.insert([{}],{})
    db.tablename.insertOne({})
    db.tablename.insertMany([{}],{})
    
    删:
    remove({})
    官方推荐:
    db.tablename.deleteOne({条件})  # 删除符合条件的一条
    db.tablename.deleteMany({条件})  # 删除符合条件的多条
    -----------------------------------------------------------------------------------------
    改: $set
    db.tablename.update({条件}, {$set:{field:value}})
    官方推荐
    updateOne({条件}, {$set:{field:value}})
    updateMany({条件}, {$set:{field:value}})
    
    修改器
    $set  暴力修改
    $unset  暴力删除
    $inc +1 +-1 引用增加
    
    array 修改器
    $push 追加 list中的append   追加数据,追后追加   updateOne({score:100}, {$push:{list_field:1}})
    $pull 追加 list中的remove  删除某元素  updateOne({score:100}, {$pull:{list_field:1}})
    $pushAll 追加 list中的extends   迭代追加最后追加数据   updateOne({条件}, {$push:{list_field:[1,2,3]}})
    $pop 追加 list中的pop  删除第一个或最后一个元素  updateOne({score:100}, {$pop:{field_list:6}}) /updateOne({条件}, {$pop:{list_field:1}})
    
    $ - 符合条件的下标 -array中
    [1,2,5,21,7,1]  $=2
    updateOne({score:100}, {$set:{list.$:1000}})
    # 存储符合条件元素的下标索引,只能存放一个下标 - 只能存放符合条件第一个
    -----------------------------------------------------------------------------------------
    查
    	find({})
    并列条件
    	find({name:"1, "age":2})
    或条件 - 不容的字段的或
    	$or findOne({$or:[{"name:"1"},{"age": 12}]})
    子集  位置可以发生变化
    	$in findOne({"age":{$in:[12,34,54]}})
    完全符合  位置可以发生变化
    	$all findOne({"age":{$all:[12,34,54]}})
    -----------------------------------------------------------------------------------------
    sort limit skip         
    find({"age":{$all:[1,2,3,4]}}).sort({"key":-1})
    find({"age":{$all:[1,2,3,4]}}).limit(5)   # 显示当前位置向下5条数据
    find({"age":{$all:[1,2,3,4]}}).skip(5)    # 跳过5调数据,作为当前位置   
    优先级                       
    find({"age":{$all:[1,2,3,4]}}).sort({"key":-1}).skip(5).limit(5)
    -----------------------------------------------------------------------------------------
    pymongo
    find()   # 对可以迭代的                       
    findOne()  = find_one  #字典
    update_many()
    res = insert_one  # 去当前插入数据的——id res.inserted_id
    res = insert_many  # 去当前插入数据的——id res.inserted_ids                   
    pymongo排序 sort(key,pymongo.DESCENDING = -1) 
    pymongo排序 sort(key,pymongo.AESCENDING = 1)                       
    -----------------------------------------------------------------------------------------
    

    windows安装问题:

    D:ProgramFilesBianChengmongodb-win32-x86_64-2008plus-ssl-4.0.4>mongo
    MongoDB shell version v4.0.4
    connecting to: mongodb://127.0.0.1:27017
    2018-11-19T17:51:37.147+0800 E QUERY [js] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: ����Ŀ�����������ܾ����޷��� �ӡ� :
    connect@src/mongo/shell/mongo.js:257:13
    @(connect):1:6
    exception: connect failed
    稀里哗啦一大堆错误。
    解决办法:
    1.
    mongod 查看一下,他报的,找不到一个文件夹/data/db/
    2020-01-08T17:48:15.317+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] MongoDB starting : pid=17960 port=27017 dbpath=C:datadb 64-bit host=DESKTOP-LTGANIS
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] db version v4.0.14
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] git version: 1622021384533dade8b3c89ed3ecd80e1142c132
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] allocator: tcmalloc
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] modules: none
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten] build environment:
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten]     distmod: 2008plus-ssl
    2020-01-08T17:48:15.321+0800 I CONTROL  [initandlisten]     distarch: x86_64
    2020-01-08T17:48:15.322+0800 I CONTROL  [initandlisten]     target_arch: x86_64
    2020-01-08T17:48:15.322+0800 I CONTROL  [initandlisten] options: {}
    2020-01-08T17:48:15.325+0800 I STORAGE  [initandlisten] exception in initAndListen: NonExistentPath: Data directory C:datadb not found., terminating   # 这里看到了我能认识的文字了,找不到文件夹
    2020-01-08T17:48:15.325+0800 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
    2020-01-08T17:48:15.325+0800 I CONTROL  [initandlisten] now exiting
    2020-01-08T17:48:15.325+0800 I CONTROL  [initandlisten] shutting down with code:100
    2.
    cd D:mongdbdata
    mkdir db  # 创建文件夹
    3.
    在cmd输入mongod.exe --dbpath D:mongdbdatadb
      D:mongdbdatadb  代表你的要存放的位置,这里是我的位置,你要事先把这个文件夹建立好,不然要报错
    此时,这个cmd窗口不要关闭,再次打开一个新的cmd窗口输入mongo命令:mongo如果进去了就好了
    
    总结:其实就是socket连接不上,而且mongodb数据没地方存储,所以初始化一个存储数据的文件夹,第二步的命令就是
    
  • 相关阅读:
    删除linux系统中的eth0.bak与多余的网卡 枯木
    linux下netstat详解 枯木
    世事无常中渐渐长大 枯木
    Redhat enterprise linux6.0的yum源配置 枯木
    yum的常用命令 枯木
    AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用(含6.9中文定义补丁) 枯木
    shell简单管理iptables脚本 枯木
    RHEL6 下Cfengine V3 安装测试1 枯木
    存储过程事务
    C#加密方法汇总
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/12192167.html
Copyright © 2011-2022 走看看