• MongoDB入门


     命名行操作

    show dbs 查看当前服务器存在多少DB

    use ss1db CreateDatabase 使用不存在的对象即创建该对象 没有即创建

    show tables 查看当前DB中有多少表(Collection)

    mongodb的数据存储结构 :
    user = [{
    name:dragon,
    age:20,
    gender:"man"
    },]

    ObjectID :Documents 自生成的 _id
    	objectID是⼀个12字节的⼗六进制数:
    	前4个字节为当前时间戳,接下来3个字节的机器ID
    	接下来的2个字节中MongoDB的服务进程id,最后3个字节是简单的增量值
    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:时间戳
    ISODate:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
    01.数据类型
    不手动创建集合:
    向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来
    
    手动创建集合:
    db.createCollection(name,options)
    db.createCollection("stu")
    db.createCollection("sub", { capped : true, size : 10 } )
    参数capped: 默认值为false表示不设置上限,值为true表示设置上限
    参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
    
    查看集合:show collections
    删除集合:db.集合名称.drop()
    02.集合操作
    增:
    insert x 官方已经不推荐使用这个LowB的方法了
    insertOne({name:"123"}) 插入一条数据行(document)
    insertMany([{name:"123"},{name:"234"},{name:"345"}]) 插入多行数据
    
    查:
    查的时候没有findMany
    findOne({name:"123"}) 	查询满足条件的第一条数据
    find({name:"123"}) 		查询所有满足条件的数据
    find({条件}).pretty(): 将结果格式化
    find({条件},{_id:0,name:1,gender:1})  投影 (条件可以不写)
    	参数为字段与值,默认是不显示, 值为1表示显示
    	特殊: 对于_id列默认是显示的, 如果不显示需要明确设置为0
    
    改:
    update x 官方已经不推荐使用这个LowB的方法了
    updateOne({name:"123"},{$set:{gender:"man",age:20}}) 修改满足条件的第一条数据
    updateMany({name:"123"},{$set:{gender:"man",age:20}}) 修改所有满足条件的数据 即使只有一条也可以
    updateMany({},{$set:{gender:"man",age:20}}) 更新全部(没有则创建)
    $set: 修改器,将某个Key的值修改为某个值
    
    删:
    deleteOne({name:"123"}) 删除满足条件的第一条数据
    deleteMany({name:"123"}) 删除所有满足条件的数据
    remove({})清空数据
    02.增删改查
    $关键字:数学比较符,范围表达式,逻辑运算符
    db.student.find({age:{$lt:25}})
    db.student.find({age:{$lte:25}})
    db.student.find({age:{$gt:23}})
    db.student.find({age:{$gte:23}})
    db.stu.find({age:{$in:[18,28]}})
    
    
    $修改器:
    1.$set: 将某个Key的值修改为某个值
    2.$unset: 删除字段(field) db.student.updateOne({age:84},{$unset:{head:1}})
    3.$inc : 将原有值增加多少 db.student.updateOne({age:85},{$inc:{age:1000}})
    4.$push: [].append() 在arrays中在最后位置追加一个数据 db.student.updateOne({age:1085},{$push:{hobby:"chezhen"}})
    5.$pull: [].remove(item) 在array中删除一个元素 db.student.updateOne({age:1085},{$pull:{hobby:"chezhen"}})
    6.$pop : 删除array中的第一个或最后一个元素,-1:第一个 1:最后一个
    03.$关键字 与 $修改器
    ⽅法sort(), ⽤于对集合进⾏排序
    db.集合名称.find().sort({字段:1,...})
    参数1为升序排列
    参数-1为降序排列
    根据性别降序, 再根据年龄升序
    db.stu.find().sort({gender:-1,age:1})
    
    limit(2) : 选取,从0-2的数据
    skip(2) : 跳过 2 条数据 从第3条数据开始 
    分页查询:
    skip(page+count).limit(count)     (先skip再limit,效率要高一下)
    
    ⽅法count()⽤于统计结果集中⽂档条数
    db.集合名称.find({条件}).count()
    db.集合名称.count({条件})
    db.stu.find({gender:true}).count()
    db.stu.count({age:{$gt:20},gender:true})
    
    
    ⽅法distinct()对数据进⾏去重
    db.集合名称.distinct('去重字段',{条件})
    db.stu.distinct('hometown',{age:{$gt:18}})
    04.排序,分页,count,distinct
    聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。 
    db.集合名称.aggregate({管道:{表达式}})
    
    在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
    常用管道如下:
    $group: 将集合中的⽂档分组, 可⽤于统计结果
    $match: 过滤数据, 只输出符合条件的⽂档
    $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
    $sort: 将输⼊⽂档排序后输出
    $limit: 限制聚合管道返回的⽂档数
    $skip: 跳过指定数量的⽂档, 并返回余下的⽂档
    $unwind: 将数组类型的字段进⾏拆分
    
    
    
    常用聚合表达式
    
    语法:表达式:'$列名'
    常⽤表达式:
    $sum: 计算总和, $sum:1 表示以⼀倍计数
    $avg: 计算平均值
    $min: 获取最⼩值
    $max: 获取最⼤值
    $push: 在结果⽂档中插⼊值到⼀个数组中
    $first: 根据资源⽂档的排序获取第⼀个⽂档数据
    $last: 根据资源⽂档的排序获取最后⼀个⽂档数据
    
    =========================
    $group
    $group _id表示分组的依据,使用某个字段的格式为 ‘$字段’ ,当_id:null 则表示所有的文档分为一组
    
    注意点:
    - `$group`对应的字典中有几个键,结果中就有几个键
    - 分组依据需要放到`_id`后面
    - 取不同的字段的值需要使用$,`$gender`,`$age`
    - 取字典嵌套的字典中的值的时候`$_id.country`
    - 能够同时按照多个键进行分组`{$group:{_id:{country:"$country",province:"$province"}}}`
      - 结果是:`{_id:{country:"",province:""}`
    
    
    $project 
    修改输入文档的结构,如,重命名,增加,删除字段,创建计算结果
    
    $match  
    用于过滤数据,只输出符合条件的文档,能将结果交给后一个管道
    但是find不可以
    05.管道 分组 聚合

     

    db.stu.find(
      {$or:[{age:{$gte:20}},{hometown:{$in:["桃花岛","华⼭"]}}]}
      )
    
    #按照gender进行分组,获取不同组数据的个数和平均年龄
    db.stu.aggregate(
      {$group:{_id:"$gender",count:{$sum:1},avg_age:{$avg:"$age"}}},
      {$project:{gender:"$_id",count:1,avg_age:"$avg_age",_id:0}}
      )
    # 按照hometown进行分组,获取不同组的平均年龄
    db.stu.aggregate(
      {$group:{_id:"$hometown",mean_age:{$avg:"$age"}}}
      )
    #使用$group统计整个文档
    db.stu.aggregate(
      {$group:{_id:null,count:{$sum:1},mean_age:{$avg:"$age"}}}
      )
    #选择年龄大于20的学生,观察男性和女性有多少人
    db.stu.aggregate(
      {$match:{$or:[{age:{$gt:20}},{hometown:{$in:["蒙古","⼤理"]}}]}},
      {$group:{_id:"$gender",count:{$sum:1}}},
      {$project:{_id:0,gender:"$_id",count:1}}
      )
    
    练习:
    { "country" : "china", "province" : "sh", "userid" : "a" }  
    {  "country" : "china", "province" : "sh", "userid" : "b" }  
    {  "country" : "china", "province" : "sh", "userid" : "a" }  
    {  "country" : "china", "province" : "sh", "userid" : "c" }  
    {  "country" : "china", "province" : "bj", "userid" : "da" }  
    {  "country" : "china", "province" : "bj", "userid" : "fa" }  
    需求:统计出每个country/province下的userid的数量(同一个userid只统计一次)
    
    答案:
    db.tv3.aggregate(
      {$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
      {$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
      {$project:{country:"$_id.country",province:"$_id.province",count:1,_id:0}}
      )
    05.案例
    索引:以提升查询速度
    
    测试:插入10万条数据到数据库中
    for(i=0;i<100000;i++){db.t12.insert({name:'test'+i,age:i})}
    
    db.t1.find({name:'test10000'})
    db.t1.find({name:'test10000'}).explain('executionStats')
    
    建立索引之后对比:
    语法:db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序
    具体操作:db.t1.ensureIndex({name:1})
    db.t1.find({name:'test10000'}).explain('executionStats')
    
    
    创建唯一索引:(在默认情况下创建的索引均不是唯一索引)
         db.t1.ensureIndex({"name":1},{"unique":true})  
    创建唯一索引并消除重复:
         db.t1.ensureIndex({"name":1},{"unique":true,"dropDups":true})  
    建立联合索引(什么时候需要联合索引):
         db.t1.ensureIndex({name:1,age:1})
    查看当前集合的所有索引:
         db.t1.getIndexes()
    删除索引:
         db.t1.dropIndex('索引名称')
    06.索引
    备份的语法:
        mongodump -h dbhost -d dbname -o dbdirectory
    -h: 服务器地址, 也可以指定端⼝号
    -d: 需要备份的数据库名称
    -o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
    
    恢复语法:
         mongorestore -h dbhost -d dbname --dir dbdirectory
    -h: 服务器地址
    -d: 需要恢复的数据库实例
    --dir: 备份数据所在位置
    
    eg: mongorestore -d test2 --dir ~/Desktop/test1bak/test1
       
    07.数据的备份和恢复

     pymongo模块

     1 mongo_conn = pymongo.MongoClient(host="127.0.0.1",port=27017) 建立连接
     2 mongo_db = mongo_conn["test2"] 选取数据
     3 
     4 查询:
     5 #pymongo的Cursor对象需要循环,循环到最后一个后,无法再次使用for循环
     6 res = mongo_db.student.find({"name":"alex"}) 
     7 for i in res:
     8     print(i)
     9 
    10 res = mongo_db.student.find_one({"age":25}) 返回的是一个Dict
    11 print(res)
    12 
    13 增加:
    14 res = mongo_db.student.insert_one({"name":"nezha","age":20})
    15 print(res)  # inserOneResult
    16 print(res.inserted_id) # 当前插入对象的_id
    17 
    18 res = mongo_db.student.insert_many([{"name":"nezha1","age":20},{"name":"nezha2","age":20}])
    19 print(res) inserManyResult
    20 print(res.inserted_ids) # 当前插入所有对象的_id 是个list
    21 
    22 更新:
    23 res = mongo_db.student.update_one({"name":"nezha1"},{"$set":{"age":22}})
    24 print(res) UpdateResult
    25 print(res.acknowledged) # True 更新成功
    26 
    27 res = mongo_db.student.update_many({"age":30},{"$set":{"age":25}})
    28 print(res) UpdateResult
    29 print(res.raw_result) # 受影响行数
    30 print(res.acknowledged) # True 更新成功
    31 
    32 删除:
    33 res = mongo_db.student.delete_one({"name":"nezha1"})
    34 print(res) DeleteResult
    35 print(res.acknowledged) # True 删除成功
    36 print(res.deleted_count) # 删除行数 只能是1
    37 print(res.raw_result) 受影响行数
    38 
    39 res = mongo_db.student.delete_many({"age":25})
    40 print(res) DeleteResult
    41 print(res.acknowledged) # True 删除成功
    42 print(res.deleted_count) # 删除行数 可以大于1
    43 print(res.raw_result) 受影响行数
    44 
    45 清除数据:
    46 res = mongo_db.student.remove({})
    47 print(res) # 受影响行数 返回值 n > 0 清楚成功
    48 
    49 
    50 # 查询_id等于 5b7e0a6eaeb4a3336c0f9b71
    51 # from bson import ObjectId #必须使用ObjectId去查询_id
    52 # res = mongo_db.school.find_one({"_id":ObjectId("5b7e0a6eaeb4a3336c0f9b71")})
    53 # print(res)
    54 
    55 limit skip sort:
    56 sort的用法,与pymysql中的用法及其相似,已经不是mongodb中的sort用法
    57 res = mongo_db.school.find({}).limit(2).skip(1).sort("name",pymongo.ASCENDING)
    58 for i in res:
    59     print(i)
    01.操用操作

    参考:

    1.https://www.w3cschool.cn/mongodb/

    2.https://docs.mongodb.com/

  • 相关阅读:
    利用.Net的CLR和BCL实现函数IsNumeric
    30岁前挣到10万年薪 五位年轻人的高薪秘诀
    三级关链菜单通用版
    对Session和Cookie的区分与理解
    转贴:C#排序算法大全
    无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
    ASP.NET中“检测到有潜在危险的表单值”的解决方法
    如何让网页版面更适合浏览者呢?这里有技巧
    十二星座情侣恋爱积分
    asp.net 三种基本的参数传递方法(web forms)
  • 原文地址:https://www.cnblogs.com/carlous/p/10668724.html
Copyright © 2020-2023  润新知