mongoDB - 高级语法

B站视频: https://www.bilibili.com/video/BV1xz4y1X7cE MongoDB 数据库笔记

介绍了 mongoDB 数据库的分页,索引等高级语法

1 .排序&分页

  • sort

    排序

    db.集合名.find(...).sort({键: 1|-1})
    
    注意: 1: 升序, -1: 降序
    
  • skip & limit

    skip : 跳过指定数量(可选)
    limit : 限制查询的数量

    查询跳过前两条,显示剩下的前两条数据

    db.c2.find().skip(2).limit(2) 
    
  • count

    统计总数量

    db.c2.find().count() 
    

2. 聚合查询

原始数据

db.c3.insert({name: "a",sex: "男",age: 4})
db.c3.insert({name: "b",sex: "女",age: 8})
db.c3.insert({name: "c",sex: "男",age: 10})
db.c3.insert({name: "d",sex: "男",age: 6})
db.c3.insert({name: "e",sex: "女",age: 12})
db.c3.insert({name: "f",sex: "男",age: 18})
db.c3.insert({name: "g",sex: "男",age: 20})
db.c3.insert({name: "h",sex: "女",age: 14})
db.c3.insert({name: "i",sex: "男",age: 9})
  • 基本语法

    db.集合名.aggregate([
        {
            管道: {
                表达式
            }
        },
    	...
    ])
    
    db.集合名.aggregate({管道: {表达式}})
    只能写一个管道,写到[]里面可以写多个
    
    管道作用
    $group将集合中的文档分组,可用于统计结果。
    $sort将输入文档排序后输出
    $skip在聚合管道中跳过指定数量的文档,并返回余下的文档。
    $limit用来限制MongoDB聚合管道返回的文档数
    $project修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套
    $match用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
    $unwind将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
    $geoNear输出接近某一地理位置的有序文档
    表达式作用
    $sum计算总和,$sum: 1相当于count()
    $avg计算平均值
    $min获取集合中所有文档对应值得最小值
    $max获取集合中所有文档对应值得最大值。
    $push在结果文档中插入值到一个数组中
    $addToSet在结果文档中插入值到一个数组中,但不创建副本
    $first根据资源文档的排序获取第一个文档数据
    $last根据资源文档的排序获取最后一个文档数据
  • $group & $sort

    发布统计男生和女生的总年龄, 平均年龄, 最大年龄, 最小年龄, 并按人数降序

    db.c3.aggregate([
        {
        	$group: {
                _id: "$sex",
                count: {$sum: 1},
                avgAge: {$avg: "$age"},
                maxAge: {$max: "$age"},
                minAge: {$min: "$age"}, 
        	}
        },
        {$sort: {count: -1}},
    ])
    
  { "_id" : "男", "count" : 6, "avg" : 11.166666666666666, "ageMax" : 20, "ageMin" : 4 }
  { "_id" : "女", "count" : 3, "avg" : 11.333333333333334, "ageMax" : 14, "ageMin" : 8 }
  注意: _id: "$sex"	 
  固定写法,表示以sex字段分组(可以为null,null代表全部数据),这里sex字段前面必须有$符号
  • $project & $skip & $limit

    只显示第三, 第四行的 age, name 列

    db.c3.aggregate([
    	{ 
            $project : {
                _id: 0,
                age : 1 ,
                name : 1 ,
        	}
        },
        {$skip: 2},
        {$limit: 2}
    ])
    
    { "name" : "c", "age" : 10 }
    { "name" : "d", "age" : 6 }
    
  • $match

    显示 age 在12-18的数据

    db.c3.aggregate([
        {
            $match: {
                age: {
                    $gte: 12, 
                    $lte: 18
                }
            }
        }
    ])
    

3. 索引

原始数据

for(i=0;i<100000;i++){db.c4.insert({name: "a"+i,age: 1+i})}
  • 创建索引

    db.c4.createIndex({键: 1|-1},[{可选参数: 值}])
    
    注意: 
      1. 1: 升序, -1: 降序
    	 例如: age: 1 表示创建age索引并按照升序的方式存储
      2. createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
    
    参数类型作用
    namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称
    backgroundbackground建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
    uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
    sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
    expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
    weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重

    给 name 字段加上索引

  db.c4.createIndex({name: 1})
{
      "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

给age字段加上索引,并起一个索引名称

  db.c4.createIndex({age: 1},{name: "aaaaa"})
{
      "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}
  • 查看索引

    • 查看索引

      db.c4.getIndexes()
      
      [
              {
                      "v" : 2,
                      "key" : {
                              "_id" : 1
                      },
                      "name" : "_id_"
              },
              {
                      "v" : 2,
                      "key" : {
                              "name" : 1
                      },
                      "name" : "name_1"
              },
              {
                      "v" : 2,
                      "key" : {
                              "age" : 1
                      },
                      "name" : "aaaaa"
              }
      ]
      
    • 查看索引大小

      db.c4.totalIndexSize()
      
  • 删除索引

    • 删除全部索引

      db.c4.dropIndexes()
      
      注意: 系统自带的索引删除不了
      
  • 删除指定索引

      db.集合名.dropIndex("索引名称")
    

    删除 name 索引和 age 索引

      db.c4.dropIndex("name_1")
      db.c4.dropIndex("aaaaa")
    
      注意: 
        1. name 字段索引的名称可通过查看索引得到
        2. age 字段索引的名称就是自己自定义的
      
      > db.c4.dropIndex("name_1")
      { "nIndexesWas" : 3, "ok" : 1 }
      > db.c4.dropIndex("aaaaa")
      { "nIndexesWas" : 2, "ok" : 1 }
      > db.c4.getIndexes()
      [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
    

4. 权限机制

  1. 添加超级管理员

    use admin
    db.createUser({"user": "admin","pwd": "admin","roles": [{role: "root",db: "admin"}]})
    
  2. 退出后卸载服务

    管理员身份运行dos窗口,在bin目录下执行

    mongod --remove
    
  3. 重新安装需要账号密码的服务

    mongod --install --dbpath E:\mongodb\data --logpath E:\mongodb\logs\mongodb2.log --auth
    
    注意: 日志名不能重复
    
  4. 启动服务

    net start mongodb
    
  5. 如何登陆

    • 第一种
    mongo 127.0.0.1:27017/admin -u admin -p admin
    
    • 第二种
    mongo
    use admin
    db.auth("admin","admin")
    

5. 备份还原

  • 备份

    mongodump -h -port -u -p -d -o
    
    -h host 服务器IP地址(一般不写,默认本机)
    -port 端口(一般不写,默认27017)
    -u user 账号
    -p pwd 密码
    -d database 数据库(不写则导出全部)
    -o open 备份到指定目录下
    

    例:

    mongodump -u admin -p admin -o E:\mongodb\bak
    

6. 可视化工具(RoRo 3T)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王文聪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值