zoukankan      html  css  js  c++  java
  • MongoDB的高级使用

    MongoDB的高级使用

    1. Mongdb的索引备份以及和python交互

    • t255为mongodb中的集合
    • 1.1 创建索引
      • 索引的特点:提高查找的效率
      • 不创建索引的情况下的查询:
        for(i=0;i<100000;i++){db.t255.insert({name:'test'+i,age:i})} 先插入10w的数据便于查询
        db.t255.find({name:'test10000'}).explain('executionStats') 查询第10001条的数据所用的时间为 "executionTimeMillis" : 121,121ms
      • 现在创建索引
        • 方法:
          • db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序
          • db.集合.createIndex({属性:1})
            db.t255.ensureIndex({age:1}),
            db.t255.createIndex({age:1})  
        
        这两个方法都可以
        • 实践:
            db.t255.ensureIndex({age:1})
            db.t255.find({name:'test10000'}).explain('executionStats')
        
        查询第10001条的数据所用的时间为 ""executionTimeMillis" : 41,41ms 明显的提升了查询的速度
    • 1.2 索引的查看
      • db.t255.getIndexes()
      • 说明:查看索引:默认情况下_id是集合的索引,添加索引后查看是就可以查看到两个缩影
        如下:
            > db.t255.getIndexes()
                [
                {
                        "v" : 2,
                        "key" : {
                                "_id" : 1
                        },
                        "name" : "_id_",
                        "ns" : "test.t255"
                },
                {
                        "v" : 2,
                        "key" : {
                                "age" : 1
                        },
                        "name" : "age_1",
                        "ns" : "test.t255"
                }
                ]
        
    • 1.3 mongodb创建唯一索引
      • 原因:在默认情况下mongdb的索引字段的值是可以相同的,仅仅能够提高查询速度,为了精确的查找要加唯一索引
      • 格式:在创建索引的时候后面加一个,{"unique":true}就可以了
        db.t255.createIndex({age:1},{"unique":true})
      • 结果:通过加唯一性的索引,我们可以杜绝插入字段值相同的问题
    • 1.4 删除索引
      • 格式(也可以说语法):db.t1.dropIndex({'索引名称':1})
        db.t255.dropIndex({name:1})
      • 这是一个可以删除索引的方法,但是对于默认的_id它也没得办法。。。
        {
            "ok" : 0,
            "errmsg" : "cannot drop _id index",
            "code" : 72,
            "codeName" : "InvalidOptions"
        }
      
      这是删除_id的时候结果
    • 1.5 建立复合索引
      • 原因:在进行数据去重的时候,可能用一个字段来保证数据的唯一性,这个时候可以考虑建立复合索引来实现。
      • 语法:db.collection_name.ensureIndex({字段1:1,字段2:1})
      • 这就是添加一个并列的索引,两个算一个索引但是干两个的活
        db.t255.ensureIndex({age:1,name:2}) 结果如下:这里只显示重点的内容
            {
                    "v" : 2,
                    "key" : {
                            "age" : 1,
                            "name" : 2
                    },
                    "name" : "age_1_name_2",
                    "ns" : "test.t255"
            }
        
    • 1.6 索引的小结
      • 特点:
        • 根据需要选择是否需要建立唯一索引
        • 索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是带复合索引的条件下会有影响

    2. mongodb的备份和恢复

    • 2.1 备份
      • 语法:mongodump -h dbhost -d dbname -o dbdirectory
      • -h: 服务器地址,也可以指定端口号,如果本地可以不写
      • -d: 需要备份的数据库名称,没的说必写
      • -o: 备份的数据存放位置,此目录中存放着备份出来的数据
        mongodump -d test -o ./ 备份到本地本文件夹
    • 2.2 恢复
      • 语法:mongorestore -h dbhost -d dbname --dir dbdirectory
      • -h,-d,--dir都和备份差不多一个意思,不过是恢复的专属的 --dir 可以看成 -o
        mongorestore -d test --dir ./test 从本地恢复

    3. mongodb和python交互

    • 3.1 mongdb和python交互的模块
      • pymongo 提供了mongdb和python交互的所有方法 安装方式: pip install pymongo
    • 3.2 使用pymongo
        from pymongo import MongoClient  
        client = MongoClient(host,port)  如果是本地可以写成: client = MongoClient()
        collection = client[db名][集合名]
      
    • 3.3 mongodb在python中的增删改查
        • ret = collection.insert_one({"name":"test1","age":1}) 增加一个
        • item_list = [{"name":"test{}".format(i)} for i in range(10)] 增加多个
        • collection.delete_one({"name":"test10010"}) 删除一个满足条件的数据
        • collection.delete_many({"name":"test10010"}) 删除所有满足条件的数据
        • collection.update_one({"name":"test10005"},{"$set":{"name":"new_test10005"}}) 更新一个满足条件的数据
        • collection.update_many({"name":"test10005"},{"$set":{"name":"new_test10005"}}) 更新所有满足条件的数据
        • t = collection.find_one({"name":"test10005"}) 查询一个满足条件的数据
         find返回所有满足条件的结果,如果条件为空,则返回数据库的所有
         t = collection.find({"name":"test10005"})
         结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,
         for i in t:
         print(i)
         for i in t: #此时t中没有内容
         print(i)
        
  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/marchpy/p/10544492.html
Copyright © 2011-2022 走看看