• 在MongoDB中执行查询与创建索引


    实验目的:
    (1)掌握MongoDB中数据查询的方法;
    (2)掌握MongoDB中索引及其创建;
    实验内容:
    一、 MongoDB中数据查询的方法;
    (1)find函数的使用;
    (2)条件操作符: a l l 匹 配 所 有 、 all匹配所有、 allexists判断字段是否存在、null值处理、$mod取模运算、不等于、包含、不包含、数组元素个数、限制返回、排序、分页、随机显示。
    (3)distinct找出给定键所有不同的值;
    (4)group分组;
    (5)游标;
    (6)存储过程。
    二、 MongoDB中索引及其创建;
    (1)基础索引;
    (2)文档索引;
    (3)组合索引;
    (4)唯一索引;
    (5)强制使用索引;
    (6)扩展索引;
    (7)删除索引
    (8)explain执行计划

    一、MongoDB中数据查询的方法

    (1). find函数的使用

    db.student.find() 查询所有数据
    在这里插入图片描述

    (2). 条件操作符

    $all匹配所有、
    db.student.find({sex:{$all:['male']}})
    查询男生的学生数据
    在这里插入图片描述
    $exists判断字段是否存在
    > db.student.find({class: {$exists:true}})
    查询所有拥有class字段的学生信息;如果exists:false,表示不存在这个字段的信息。
    在这里插入图片描述
    null值处理
    teacher集合中,_id=1的数据没有字段age,或者说age字段对应的值是null,所以可以进行null值处理,将他查出来。
    db.teacher.find({age:null})
    在这里插入图片描述
    $mod取模运算
    例如:找出teacher集合中年龄age对10取模等于1的人的数据。
    db.teacher.find({age:{$mod:[10,1]}})

    在这里插入图片描述
    运算符:
    - $gt 大于
    - $gte 大于等于
    - $lt 小于
    - $lte 小于等于
    - $ne 不等于
    - $in 包含
    - $nin 不包含
    - $eq 等于

    查询学生年龄大于22的数据
    db.student.find({age:{$gt:22}})

    在这里插入图片描述
    查询学生年龄小于22的数据
    db.student.find({age:{$lt:22}})
    在这里插入图片描述

    查询学生年龄等于22的数据
    db.student.find({age:{$eq:22}})
    在这里插入图片描述

    数组元素个数
    db.student.count()#查出student集合中的记录数
    db.student.find({sex:'male'}).count()#查出student集合中sex=male的人数
    在这里插入图片描述
    限制返回
    db.student.find({},{sname:1}) # 返回sname字段其余不返回(id也返回)
    db.student.find({},{sname:0}) # 除sname字段不返回外,其余都返回。
    在这里插入图片描述
    排序
    按照年龄从大到小的顺序给学生表排序
    db.student.find().sort({age:-1})
    在这里插入图片描述
    从小到大的顺序排序
    db.student.find().sort({age:1})
    在这里插入图片描述
    分页
    例如取前两条数据做分页。(如果想从后往前取数据,那么数字前加负号 ’ - ’)
    db.student.find().limit(2)

    在这里插入图片描述
    随机显示
    db.student.aggregate([ { $sample: { size: N } } ] )
    从学生表中随机取出N条数据。

    在这里插入图片描述

    (3)distinct找出给定键所有不同的值;

    db.student.distinct(‘sname’) #找出不同的名字
    在这里插入图片描述

    (4)group分组

    求出年龄总和
    db.student.aggregate( [
       {
         $group: {
            _id: null,
            total: { $sum: "$age" }
         }
       }
    ] )
    

    在这里插入图片描述
    求学生的平均年龄

    db.student.aggregate([
    {      
    	$group: {         
    	_id: null,         
    	total: { $avg: "$age" }      
    	}    
    } 
    ])
    

    在这里插入图片描述

    (5)游标;

    定义游标
    var mycursor = db.student.find()
    在这里插入图片描述
    打印结果

    while(mycursor.hasNext()){ 
    printjson(mycursor.next());
    }
    

    在这里插入图片描述
    也可以使用游标的forEach(printjson); 迭代访问文档.
    在这里插入图片描述
    显示游标状态信息

    > db.serverStatus().metrics.cursor
    {
    	"timedOut" : NumberLong(0),
    	"open" : {
    		"noTimeout" : NumberLong(0),
    		"pinned" : NumberLong(0),
    		"total" : NumberLong(0)
    	}
    }
    
    • timedOut:自服务器器启动以来超时游标数;
    • noTimeout:使用DBQuery.Option.noTimeout 选项防止超时打开的游标数;
    • pinned :打开的游标数量;
    • total:打开游标的总数量;

    关闭不活跃的游标

    如果一个游标还没有遍历完,但是不使用了,需要将该游标关闭。默认情况下,服务器会自动关闭超过10分钟活跃的游标和还未耗尽的游标。你也可以自己手动关闭。

    手动关闭前:var mycursor = db.student.find().noCursorTimeout();
    然后在 cursor.close()
    在这里插入图片描述

    (6)存储过程。

    MongoDB 存储过程是存储在 db.system.js 表中的.
    1、 添加存储过程

    db.system.js.save
    (
    	{
    	_id:"getStuCount",
    	value:function(){
    	return db.student.find().count();
    		},
    	description:"获取总数"
    	}
    )
    

    执行存储过程:var obj = db.eval(“getStuCount()”);

    在这里插入图片描述

    2、 查询存储过程
    db.system.js.find();
    在这里插入图片描述
    3、 修改存储过程
    先添加一个add的存储过程

    db.system.js.save({_id:“add”,value:function(x,y){return x+y;}})

    在这里插入图片描述
    在这里插入图片描述
    修改add存储过程:

    db.system.js.update(
     {_id:"add"},
     {$set:{value:function(x,y,z){return x+y+z;}}}
    );
    

    db.loadServerScripts():重新加载存储过程
    查看存储过程,并执行
    在这里插入图片描述
    在这里插入图片描述
    4、 删除存储过程

    db.system.js.remove({_id:‘getStuList’});
    在这里插入图片描述

    MongoDB中索引及其创建

    先向orders文档中添加数据

    db. orders.insert({
             "onumber" : i,  
             "date" : "2020-06-09",  
             "cname" : "hht"+i,  
              "items" :[ { 
                       "ino" : i,
                      "quantity" : i,  
                      "price" : 4.0
                },{ 
                      "ino" : i+1,
                      "quantity" : i+1,  
                      "price" : 6.0
                 }
              ]
        })
    

    (1)基础索引;
    默认索引:创建文档的时候,没有指定_id的值,MongoDB会自动创建一个ObjectId,并将一个索引创建在 _id 键上,默认索引的名称是“_id”,并且无法删除。
    db.orders.getIndexes()查看orders文档的索引信息

    在这里插入图片描述
    单键索引:对文档的某个字段创建单建索引

    db.orders.createIndex({cname:1})
    {
    “createdCollectionAutomatically” : false,
    “numIndexesBefore” : 1,
    “numIndexesAfter” : 2,
    “ok” : 1
    }

    索引名默认是cname_1
    在这里插入图片描述
    (2)文档索引;

    单列内嵌文档索引。
    db.orders.createIndex({“item.info”:1})
    在这里插入图片描述
    查看索引
    在这里插入图片描述
    (3)组合索引;
    创建组合索引
    db.orders.createIndex({cname:1,onumber:-1})
    在这里插入图片描述
    在这里插入图片描述
    (4)唯一索引;
    给orders文档中的onumber字段添加上唯一索引。
    db.orders.createIndex({onumber:1},{unique:true})
    在这里插入图片描述
    查看索引信息
    在这里插入图片描述
    (5)强制使用索引;
    在find()后加上 hint可以强制使用某个索引。
    db.orders.find({“cname”:{$gt:“hht1000”},“onumber”:2000}).hint({onumber:1})

    这里是强制使用 onumber字段上的索引。

    对这个查询执行explain()
    db.orders.find({"cname":{$gt:"hht1000"},"onumber":2000}).hint({onumber:1}).explain()
    在这里插入图片描述
    (6)扩展索引;
    在建立复合索引的有关字段顺序的扩展
    如果我们的查询语句需要对a进行排序,对b用于覆盖索引,那就建(a,b)索引;
    如果我们的查询语句需要对b进行排序,对a用于覆盖索引,那就建(b,a)索引;
    如果我们的查询语句需要对a和b进行排序,那a,b哪个在前都可以用上索引。

    (7)删除索引

    删除索引,按照指定索引名删除

    > db.orders.dropIndex("cname_1")
    { "nIndexesWas" : 2, "ok" : 1 }
    
    

    在这里插入图片描述
    删除全部索引
    db.orders.dropIndexes()

    在这里插入图片描述
    (8)explain执行计划
    在这里插入图片描述

  • 相关阅读:
    北大软件工程——第五周:UML
    北大软件工程——第四周:结构化分析方法2
    北大软件工程——第三周:结构化分析方法1
    linux挂载u盘、光盘、硬盘
    奇偶个数、数字特征值——第4周C编程练习
    时间换算、分队列——第3周C编程练习
    逆序三位数——第2周C编程练习
    回溯算法与分支限界法
    Tyvj1032
    Tyvj1032
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121911.html
Copyright © 2020-2023  润新知