MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本

利用该脚本可以生成任意个学生信息,包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息,此处生成2万名学生,学生所有信息都是给定范围后随机生成。
生成学生信息后,再来对学生信息进行简单查询。

  1. 主函数
    函数的说明:generateStudents(生成学生的人数,年级,是否覆盖之前的值,是否分片),运行完程序后,会生成2w名学生信息
// 主程序从这里开始
generateStudents(10000,2022,true,false);//overwrite=true  1000个学生,2018级
generateStudents(10000,2021,false,false);
  1. 生成学生数据
    默认有四个参数,生成100个学生信息,年级是2020,覆盖掉之前的文档,分片
function generateStudents(snum=100, sgrade=2020, overwrite=true, sharding=true) {
		db = db.getSiblingDB("cqust"); 
		// use cqust;创建数据库
		if (sharding) {
			sh.enableSharding("cqust");
		}

		if (overwrite) {
			db.getCollection("students").drop();
			// 等价于db.students.drop() 删除students集合
			if (sharding)
				sh.shardCollection("cqust.students",{"sno":"hashed"});
		}

		for(var i=0; i<snum/100; i++){//创建snum个学生,每100个作为一批,太多可能影响效率
			var StudentsDoc = new Array();
			for(var j=0; j<100; j++){
				var sid = sgrade*1e6+i*100+j;//定义变量
				var sname = getRandName();
				var gender = Math.floor(Math.random()*2);
				var phone = getRandPhone();
				var major = getRandMajor();
				var height = Math.floor(Math.random()*30+gender*5+150);
				var weight = Math.floor(Math.random()*30+gender*20+40);
				var sclass = Math.floor(Math.random()*4+1);
				var courses = new Array();
				for(var k=0; k<Math.floor(Math.random()*5);k++){
					var course_credit = getRandCourse();
					courses[k] = {"course":course_credit[0], "credit":course_credit[1], "score":Math.floor(Math.random()*50)+50};
				}
				
				StudentsDoc[j] = {
				"sno":sid,
				"name":sname, 
				"gender":gender, 
				// "height":height, 
				// "weight":weight,
				"body":{
					"height":height, 
					"weight":weight
					},//嵌入文档
				"list":[Math.ceil(Math.random()*6),Math.ceil(Math.random()*6),Math.ceil(Math.random()*6)],//三个随机数1-6
				"phone":phone, 
				"role":"student", 
				"major": major,
				"grade": sgrade, 
				"class": sclass, 
				"courses":courses
				};
			}
			db.getCollection("students").insertMany(StudentsDoc);
			// db.students.insertMany(StudentsDoc) 如果是1000个学生信息,插入10次,一次100
		}	
}

在该程序中,【Math.random(): 生成一个 [0, 1) 之间的随机小数(包括 0,不包括 1)。Math.random() * 6: 将随机数放大到 [0, 6) 的范围。Math.ceil(): 将上述结果向上取整,形成一个范围 [1, 6] 的整数(只有 1 到 6 这六个数能被生成)。重复三次:为了生成三个随机数,将 Math.ceil(Math.random() * 6) 这一段复制了三次,形成了一个包含这三个随机数的数组】
3. 生成随机手机号

function getRandPhone(){
    //手机开头3位数
    var heads = ["134","138","139","150","151","152","157","158","159","170","189"];
    //举例:0.5x11=5.5向下取整等于5,取heads[5]
    var phone = heads[Math.floor(Math.random()*heads.length)];
    var numbers = [1,2,3,4,5,6,7,8,9];
    for(var i=0; i<8; i++){
        phone+=numbers[Math.floor(Math.random()*numbers.length)];
    }
    return phone;
}

在该函数中,Math.random() 生成一个 [0, 1) 的随机数,通过乘以 heads.length 来得到一个适合数组索引的随机数。Math.floor 将其向下取整,确保得到一个有效的数组索引。
导入方式:

  • 命令行方式
mongo .\GenerateStudents.js
mongo .\GenerateStudents.js --shell 
(加了--shell运行完毕后,直接进入shell里面)
show dbs

db.students.find().pretty()//方便显示
  • Navicat查询方式(直接将代码复制到查询中运行即可)

在网格视图中,红色类型为字符串类型,右对齐是数值类型,如果需要展开,这种点操作符说明是嵌入文档

在这里插入图片描述

二、简单查询操作

  1. 查询身高170以上的学生
use cqust;
// 查询身高170以上的学生
//"body": {
//        "height": 179,
//        "weight": 62
//    },
var 查询条件 = {"body.height":{$gt:170}};
var 查询条件 = {"body.height":170};
// var 查询条件 = {body.height:170};// 字段名中有.和$, 不打引号要报错
var 返回字段 = {};
db.students.find(查询条件,返回字段);
  1. 身高小于160,体重大于60
// 身高小于160,体重大于60
//写法一:
var 查询条件 = {"body.height":{$lt:160}, "body.weight":{$gt:60}};
var 返回字段 = {};
db.students.find(查询条件,返回字段);
//写法二:
var 查询条件1 = {"body.height":{$lt:160}};
var 查询条件2 = {"body.weight":{$gt:60}};
var 查询条件 = {$and:[查询条件1,查询条件2]};//逻辑运算符后面必须加数组
var 返回字段 = {};
db.students.find(查询条件,返回字段);
  1. 列表字段查询
//列表字段查询
// "list": [
//        6,
//        2,
//        1
//    ]
var 查询条件1 = {"list":[4,5,6]}; // 值是数组,且完全匹配列表元素数量, 顺序不能变
var 查询条件e = {"list":[4,5]};  // 错误,值是数组,不完全匹配,查不到
//只匹配两个元素,需要用到数组查询运算符$all
var 查询条件2 = {"list":{$all:[4,5]}};  // 值是列表,元素数量完全匹配,顺序可以变
var 查询条件3 = {"list":6};  // 任意包含6的数组都查到
db.students.find(查询条件)
  1. 查询"数据导入与预处理应用"不及格的学生
//"courses": [
//        {
//            "course": "大数据分析与内存计算",
//            "credit": 4,
//            "score": 56
//        },
//        {
//            "course": "数据导入与预处理应用",
//            "credit": 4,
//            "score": 82
//        }
//    ]
// 查询"数据导入与预处理应用"不及格的学生【数组中的元素查询,结果不对】
var 查询条件 = {"courses.course":"数据导入与预处理应用","courses.score":{$lt:60}};
var 返回字段 = {};
db.students.find(查询条件,返回字段);

直接查询结果不对,因为在数组中,存在多个元素对应同一个字段条件,会使查询不能对应到元素内部。

加了$elemMatch后查询结果正确。

// 所以用$elemMatch可以在元素内进行匹配
var 查询条件 = {"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
//查询条件或者写为json格式
var 查询条件 = {
	"courses":
	{
		$elemMatch:
			{
				"course": "数据导入与预处理应用","score": {$lt:60}
			}
	}
};
var 返回字段 = {};
db.students.find(查询条件,返回字段);

注意:$elemMatch后面的写法

  1. 查询"数据导入与预处理应用"不及格的学生的学号和姓名班级,不要_id
// select * from tbname;
// select field1,field2,field3... from tbname;
// 查询"数据导入与预处理应用"不及格的学生的学号和姓名班级,不要_id
var 查询条件 = {"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
// 返回字段 = {字段名:是否返回}; 
// 值是布尔值 (true|false -> 1|0 -> inclusion|exclusion)
var 返回字段 = {sno:true,name:1,major:1,grade:1,class:1,_id:0};
//var 返回字段 = {_id:0,body:0,list:0,gender:0,role:0,phone:0,courses:0};
db.students.find(查询条件,返回字段);
  1. 查询"数据导入与预处理应用"不及格的学生的除了courses和list以外的所有字段
// 查询"数据导入与预处理应用"不及格的学生的除了courses和list以外的所有字段
var 返回字段 = {courses:0,list:0};
db.students.find(查询条件,返回字段);

// 嵌入文档中的字段也可以控制是否返回
var 返回字段 = {"courses.score":0};
db.students.find(查询条件,返回字段);

var 返回字段 = {"list":{$slice:[0,1]}}; // [起点index,取几个] index从0开始
//var 返回字段 = {"list":{$slice:-2}};    // 取几个
db.students.find(查询条件,返回字段);
  1. 修改字段名
//改字段名:新字段名:$旧字段名 构造一个新字段,通过$取旧字段的值
//$ 取值的意思
var 查询条件 = {"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
var 返回字段 = {_id:0,学号:"$sno",姓名:"$name",年级:"$grade",专业:"$major",班号:"$class"};
db.students.find(查询条件,返回字段);
  1. 查询"数据导入与预处理应用"不及格的学生的学号、姓名、年级、班级,和数据导入与预处理应用课程的成绩,不要_id
// 查询"数据导入与预处理应用"不及格的学生的学号、姓名、年级、班级,和数据导入与预处理应用课程的成绩,不要_id
var 查询条件 = {"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
var 返回字段 = {_id:0,sno:1,name:1,grade:1,major:1,"courses.course":1,"courses.score":1};
db.students.find(查询条件,返回字段);
  1. 在上一步操作基础上,返回的成绩中,只显示"数据导入与预处理应用"课程
//在上一步操作基础上,返回的成绩中,只显示"数据导入与预处理应用"课程
var 查询条件 = {"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
// 使用elemMatch匹配数组字段中满足条件的
var 返回字段 = 
{_id:0,sno:1,name:1,grade:1,major:1,"courses":{$elemMatch:{"course":"数据导入与预处理应用","score":{$lt:60}}}};
db.students.find(查询条件,返回字段);

课堂练习二:

1.利用GenerateStudents.js脚本生成2w个学生信息,并保存到mongodb中。
2.查询体重70及以上学生信息。
3.查询身高大于180,体重大于65学生信息。
4.查询"大数据概论"课程及格的学生。
5.查询"大数据概论"课程及格的学生中,除了courses和list意外的所有字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

探寻闲鱼libsgmain加解密算法(4) ——JNI入口跳转

关注我的人都知道我一直在学习阿里的加密和算法&#xff0c;除了研究逆向问题&#xff0c;还会把学来的阿里技术用在自己的应用上。 为什么&#xff1f;因为学习大厂的应用&#xff0c;是进步最快的方法。而大厂在安全和加密方面的技术&#xff0c;个人觉得阿里做的是最好的。 …

个体能量的勇气层级是否容易达到?

没有勇气面对现实&#xff0c;没有勇气改变自我&#xff0c;没有勇气改变环境&#xff0c;没有勇气创新创造。 这是常态。 如何找寻高质量免费机器人工程资源自学提升-CSDN博客 个人能力的提升&#xff0c;也包括个体能量的提升。 个体能量是个人能力的一个非常重要的衡量指…

Spring Boot整合Stripe订阅支付指南

在当今的在线支付市场中&#xff0c;Stripe 作为一款一体化的全球支付平台&#xff0c;因其易用性和广泛的支付方式支持&#xff0c;得到了许多企业的青睐。本文将详细介绍如何在 Spring Boot 项目中整合 Stripe 实现订阅支付功能。 1.Stripe简介 Stripe 是一家为个人或公司提…

C语言实现Go的defer功能

之前笔者写了一篇博文C实现Go的defer功能&#xff0c;介绍了如何在C语言中实现Go的defer功能&#xff0c;那在C语言中是否也可以实现这样的功能呢&#xff1f;本文就将介绍一下如何在C语言中实现Go的defer功能。 我们还是使用C实现Go的defer功能中的示例&#xff1a; void te…

【每日一题】LeetCode - 判断回文数

今天我们来看一道经典的回文数题目&#xff0c;给定一个整数 x &#xff0c;判断它是否是回文整数。如果 x 是一个回文数&#xff0c;则返回 true&#xff0c;否则返回 false。 回文数 是指从左往右读和从右往左读都相同的整数。例如&#xff0c;121 是回文&#xff0c;而 123 …

nuxt3项目创建

安装 npx nuxilatest init <project-name> 此时会出现报错&#xff0c;需要在host文件中加入 185.199.108.133 raw.githubusercontent.com 再次执行命令&#xff0c;进入安装 此处选择npm&#xff0c;出现下图表示安装成功 启动项目 执行npm run dev&#xff0c;访…

《皮革制作与环保科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《皮革制作与环保科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《皮革制作与环保科技》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国轻工业联合会 …

深度学习-循环神经网络-LSTM对序列数据进行预测

项目简介: 使用LSTM模型, 对文本数据进行预测, 每次截取字符20, 对第二十一个字符进行预测, LSTM层: units100, activationrelu Dense层: units输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units64 激活函数: 因为是多分类, 使用softmax 因为这是最…

已解决 django.db.utils.OperationalError: (1051, “Unknown table

报错信息&#xff1a; django.db.utils.OperationalError: (1051, "Unknown table bjybolg.tool_submission")python manage.py migrate --fake 命令用于告诉 Django 假装已经应用某个迁移&#xff0c;而不实际执行该迁移的操作。这通常在以下情况下非常有用&#x…

【大模型理论篇】大模型压缩技术之注意力层剪枝以及与MLP层联合剪枝

1. 背景分析 本来打算写一篇关于大模型蒸馏的文章&#xff0c;但刚好看到近期发表的一篇讨论大模型压缩的文章【1】&#xff0c;是关于注意力机制冗余性的讨论&#xff0c;比较有意思&#xff0c;作者分析得出并不是所有的注意力都是必须的&#xff0c;可以通过对模型去除冗余的…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的&#xff1f;在文章开头我们提出这个疑问&#xff0c;带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容&#xff0c;在日常App 中非常常见&#xff0c;比如微博的发布与展示&#xff0c;朋友圈的发布与展示&#xff0c;都在使用富文…

Elasticsearch 中的高效按位匹配

作者&#xff1a;来自 Elastic Alexander Marquardt 探索在 Elasticsearch 中编码和匹配二进制数据的六种方法&#xff0c;包括术语编码&#xff08;我喜欢的方法&#xff09;、布尔编码、稀疏位位置编码、具有精确匹配的整数编码、具有脚本按位匹配的整数编码以及使用 ESQL 进…

Maven 不同环境灵活构建

需求: 使用 Maven根据不同的构建环境&#xff08;如开发、测试、生产&#xff09;来定义不同的配置&#xff0c;实现灵活的构建管理。 需要Demo项目的可以参考&#xff1a;我的demo项目 一、项目分层 一般的初创项目不会有特别多的配置文件&#xff0c;所以使用 spring.profile…

【333基于Java Web的考编论坛网站的设计与实现

毕 业 设 计&#xff08;论 文&#xff09; 考编论坛网站设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计…

linux下gpio模拟spi三线时序

目录 前言一、配置内容二、驱动代码实现三、总结 前言 本笔记总结linux下使用gpio模拟spi时序的方法&#xff0c;基于arm64架构的一个SOC&#xff0c;linux内核版本为linux5.10.xxx&#xff0c;以驱动三线spi(时钟线sclk&#xff0c;片选cs&#xff0c;sdata数据读和写使用同一…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

SCI被「On Hold」意味着什么?会有哪些影响?

本文首发于“生态学者”微信公众号&#xff01; 继Chemosphere在2023年7月被「On Hold」之后&#xff0c;昨晚Science of The Total Environment 被标记为「On Hold」状态在各大公众号和朋友圈被刷屏&#xff01;&#xff08;官方网址&#xff1a;https://mjl.clarivate.com/s…

PouchDB - 免费开源的 JavaScript 数据库,轻量易用,用于离线保存数据的场景

这个 JS 工具库可以让我们很容易地实现数据缓存到本地的需求&#xff0c;要写的代码量也很少。 PouchDB 是一个基于 JavaScript 语言开发的轻量级的数据库&#xff0c;可以在浏览器、Node.js 等环境中使用。作者是一位来自国外的女开发工程师 Alba Herreras。 这是一个运行在浏…

el-datepicker禁用未来日期(包含时分秒)type=‘datetime’

文章目录 实现代码方式1&#xff1a;当选中日期的时候去更新一次。方式2: 优化版本&#xff0c;使用 setTimout 每分钟更新一次。&#xff08;防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变&#xff09; el-datepicker 选择器禁用未来日期&#xff0c;动态禁…