当前位置: 首页 > news >正文

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意外的所有字段。

相关文章:

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

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

java核心技术点都有哪些

1. 面向对象编程&#xff08;OOP&#xff09; 核心概念&#xff1a;类、对象、继承、封装、多态。 比喻&#xff1a;面向对象编程就像是在搭建一个积木城堡。类&#xff08;Class&#xff09;是城堡的设计图纸&#xff0c;它定义了城堡的结构和功能&#xff1b;对象&#xff08…...

4404 - 提高:二分与三分:曲线(三分)

明明做作业的时候遇到了n个二次函数Si(x)=ax22+bx+c,他突发奇想设计了一个新的函数F(x)=max(Si(x)), i=1,2...n。 明明现在想求这个函数在[0,10000]的最小值,要求精确到小数点后四位四舍五入。 输入 输入包含T 组数据 (T<10) ,每组第一行一个整数 n(n≤10000) ,之后n行…...

软件工程--需求分析与用例模型

面向对象分析(ObjectOrientedAnalysis&#xff0c;简称OOA) 分析和理解问题域&#xff0c;找出描述问题域所需的类和对象&#xff0c;分析它们的内部构成和外部关系&#xff0c;建立独立于实现的OOA模型&#xff0c;暂时忽略与系统实现有关的问题。 主要使用UML中的以下几种图…...

预测房价学习

1. 实现函数来方便下载数据 import hashlib import os import tarfile import zipfile import requestsDATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)):"""下载一个DATA_HUB中…...

电脑无法上网,但是微信、QQ可以正常使用

这种情况一般是由于DNS服务器配置错误&#xff0c;或者已有的DNS服务器无法正常解析地址造成的。 按下winR打开运行&#xff0c;输入ncpa.cpl&#xff0c;点击确定。 在打开的网络连接窗口中找到对应的网卡&#xff0c;双击打开。一般有线网是“以太网”&#xff0c;无线网&am…...

C++11新特性(列表初始化与右值引用折叠与完美转发)

c11 列表初始化c98的{}c11的{}std::initializer_list 右值引用和移动语义左值和右值的概念左值引用和右值引用引用延长临时对象生命周期左值和右值的参数匹配左值引用的主要使用场景移动构造和移动赋值引用折叠完美转发 列表初始化 c98的{} 在C98中&#xff0c;大括号 {} 的使…...

基于SSH的物流运输货运车辆管理系统源码

基于经典的ssh&#xff08;Spring Spring MVC Hibernate&#xff09;框架与SaaS&#xff08;软件即服务&#xff09;模式&#xff0c;我们为运输企业与物流公司打造了一款开源且易用的车辆管理系统。 该系统主要包含以下核心模块&#xff1a; 档案管理 财务管理 借款管理 保…...

基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)

目录 1. 延迟关闭订单 1.1 订单延时关闭功能技术选型 1.1.1 定时任务 1.1.2 RabbitMQ 1.1.3 Redis 过期监听 1.1.4 Redisson 1.1.5 RocketMQ 1.2 RocketMQ订单延时关闭发送方实现 1.3 RocketMQ订单延时关闭的消费方实现 1. 延迟关闭订单 用户发起订单后&#xff0c;如…...

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…...

腾讯云或阿里云centos7安装Redis,并解决端口无法访问的问题

问题背景 最近自建的网站JeecgFlow在云环境安装redis时候&#xff0c;出现端口无法远程进行访问。 浪费好了好久时间进行排查&#xff0c; 记录一下Redis在云环境centos7环境下如何安装&#xff0c;并且远程访问。 Redis安装 //安装c 用于编译redis yum install gcc-c//在/u…...

【小问题】距离估计和频率估计的方差下界推导出距离估计的方差下界

【1】OFDM Radar Algorithms in Mobile Communication Networks pp34 文章目录 1. 频率和距离之间的关系2. 计算 d ^ \hat{d} d^ 对 n ^ \hat{n} n^ 的导数3. 将频率的方差转化为距离的方差4. 从频率的 CRB 获得 var ⁡ [ n ^ ] \operatorname{var}[\hat{n}] var[n^]5. 将 …...

Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容

介绍 在当今数据驱动的世界中&#xff0c;抓取动态网页内容变得越来越重要&#xff0c;尤其是像抖音这样的社交平台&#xff0c;动态加载的评论等内容需要通过特定的方式来获取。传统的静态爬虫方法难以处理这些由JavaScript生成的动态内容&#xff0c;Selenium爬虫技术则是一…...

Z-BlogPHP显示错误Undefined array key 0 (set_error_handler)的解决办法

今天打开博客的时候&#xff0c;意外发现页面&#xff0c;打开均显示错误&#xff1a;Undefined array key 0 (set_error_handler)。 博客程序采用的是Z-BlogPHP。百度了一圈没有找到解决办法&#xff0c;在官方论坛里也没找到解决办法。 于是开始自己排查原因。我服务器采用…...

java-实例化一个List,然后添加数据的方法详解

在Java中&#xff0c;实例化一个 List 并向其中添加数据非常简单。List 是一个接口&#xff0c;因此我们通常使用它的常见实现类 ArrayList 或 LinkedList。以下是一些常见的操作方法&#xff1a; ### 1. 使用 ArrayList 实例化并添加数据 java import java.util.ArrayList; …...

【Linux系统】Ubuntu的简单操作

什么是 Ubuntu&#xff1f; Ubuntu&#xff08;乌帮图&#xff09;是一个非洲词汇&#xff0c;它的意思是“人性对待他人”或“群在故我在”。Ubuntu发行版将Ubuntu精神带到软件世界之中。 目前已有大量各种各样基于GNU/Linux的操作系统&#xff0c;例如:Debian,SuSE,Gentoo,R…...

标准日志插件项目【C/C++】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;项目日记_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;项目介…...

SpingBoot原理

SpingBoot原理 在前面十多天的课程当中&#xff0c;我们学习的都是web开发的技术使用&#xff0c;都是面向应用层面的&#xff0c;我们学会了怎 么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇&#xff0c;主要偏向于底 层原理。 我们今天的课程…...

Cout输出应用举例

Cout输出应用 在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <stdlib.h> //使能exit(); #include <sstream> #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和res…...

java的无锁编程和锁机制

Java 的并发编程中&#xff0c;为了保证线程安全和高性能&#xff0c;采用了两种主要的同步手段&#xff1a;锁机制和无锁编程。以下是对锁机制、无锁编程、死锁及其避免的详细讲解。 一、无锁编程 无锁编程通过原子操作来避免传统锁&#xff0c;从而减少线程的上下文切换&am…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...

VSCode 没有添加Windows右键菜单

关键字&#xff1a;VSCode&#xff1b;Windows右键菜单&#xff1b;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意&#xff0c;实际使用的时候发现 VSCode 在 Windows 菜单栏…...

git删除本地分支和远程分支

删除本地分支 git branch -d 分支名删除远程分支 git push origin --delete 分支名...

DOM(文档对象模型)深度解析

DOM(文档对象模型)深度解析 DOM 是 HTML/XML 文档的树形结构表示,提供了一套让 JavaScript 动态操作网页内容、结构和样式的接口。 一、DOM 核心概念 1. 节点(Node)类型 类型值说明示例ELEMENT_NODE1元素节点<div>, <p>TEXT_NODE3文本节点元素内的文字COMMEN…...

豆瓣图书评论数据分析与可视化

【题目描述】豆瓣图书评论数据爬取。以《平凡的世界》、《都挺好》等为分析对象&#xff0c;编写程序爬取豆瓣读书上针对该图书的短评信息&#xff0c;要求&#xff1a; &#xff08;1&#xff09;对前3页短评信息进行跨页连续爬取&#xff1b; &#xff08;2&#xff09;爬取…...