Mongodb入门--头歌实验MongoDB 文档的高级查询操作

news2024/11/24 11:42:47

数据库存储了大量的数据,当我们需要特定的数据时就要使用查询方法,根据一定的条件,筛选出我们想要的数据,前一章我们简单介绍了条件操作符(<<=>>=!=等),在这一章中我们将更全面地介绍 MongoDB 中的文档查询方法。

一、数据的导入导出

任务描述

本关任务:向数据库导入数据和从数据库导出数据。

相关知识

为了完成本关任务,你需要掌握: 1.如何向数据库导入数据; 2.如何从数据库导出数据。

向数据库导入数据

数据导入工具:mongoimport;

这是 MongoDB 自带的数据导入工具,我们在未连接客户端时使用(前提要启动服务)。

mongoimport -d Testdb1 -c score --type csv --headerline --ignoreBlanks --file test.csv
  • -d Testdb1 :指定将数据导入到 Testdb1 数据库;

  • -c score :将数据导入到集合 score ,如果这个集合之前不存在,会自动创建一个(如果省略 --collection 这个参数,那么会自动新建一个以 CSV 文件名为名的集合);

  • --type csv :文件类型,这里是 CSV;

  • --headerline :这个参数很重要,加上这个参数后创建完成后的内容会以 CSV 文件第一行的内容为字段名(导入json文件不需要这个参数);

  • --ignoreBlanks :这个参数可以忽略掉 CSV 文件中的空缺值(导入json文件不需要这个参数);

  • --file 1.csv :这里就是 CSV 文件的路径了,需要使用绝对路径。

从数据库导出数据

数据导出工具: mongoexport;

  • 导出 json 格式文件:
mongoexport -d Testdb1 -c score -o /file.json --type json
  • -o /file.json :输出的文件路径/(根目录下)和文件名;
  • --type json :输出的格式,默认为 json。
  • 导出 csv 格式的文件:
 mongoexport -d Testdb1 -c score -o /file.json --type csv -f "_id,name,age,sex,major"
  • -f :当输出格式为 csv 时,需要指定输出的字段名。
编程要求

在右侧命令行进行操作:

  • 將 /home/example 路径下的文件 student.csv 导入到数据库 mydb1 的 test 集合中;

  • 将数据库 mydb1 的 test 集合以 json 格式导出到 /home/test1.json 的 json 文件中;

  • 将数据库 mydb1 的 test 集合以 csv 格式导出到 /home/test1.csv 的 CSV 文件中。

root@evassh-12318384:~# mongoimport -d mydb1 -c test --type csv --headerline --ignoreBlanks --file /home/example/student.csv
2022-09-24T04:43:06.805+0000    connected to: localhost
2022-09-24T04:43:06.843+0000    imported 8 documents
root@evassh-12318384:~# mongoexport -d mydb1 -c test -o /home/test1.json --type json
2022-09-24T04:44:52.781+0000    connected to: localhost
2022-09-24T04:44:52.782+0000    exported 8 records
root@evassh-12318384:~# mongoexport -d mydb1 -c test -o /home/test1.csv --type csv -f "_id,name,age,sex,major"
2022-09-24T04:47:03.379+0000    connected to: localhost
2022-09-24T04:47:03.379+0000    exported 8 records

二、高级查询(一)

任务描述

本关任务:根据编程要求完成文档查询。

相关知识

为了完成本关任务,你需要掌握:各种查询操作符的用法。

$all 匹配所有

假设有集合 hobbies 内容如下:

_idnamesexhobbies
1小红唱歌,跳舞,羽毛球
2小明唱歌,乒乓球,羽毛球
3小亮乒乓球,羽毛球

查询其中所有喜欢“唱歌”和“羽毛球”的人:1

db.hobbies.find({hobbies:{$all:["唱歌","羽毛球"]})

查询结果如图1所示:

图1

图 1

 
  • $all 会查询满足方括号中所有条件的文档,如果只有其中一项满足是不会被查询出来的。
$exists 判断字段是否存在

在集合 hobbies 中更新文档:

db.hobbies.save({_id:1,name:"小红",age:18,sex:"女",hobbies:["唱歌","跳舞","羽毛球"]}) #添加小红年龄18
  • 查询 hobbies 集合中存在 age 字段的文档,如图 2 所示:

图2

图 2

 
  • hobbies 集合中不存在 age 字段的文档,如图 3 所示:

图3

图 3

 
$mod 取模运算

在集合 hobbies 中更新文档:

db.hobbies.update({_id:2},{$set:{age:20}})     #添加小明年龄20
db.hobbies.update({_id:3},{$set:{age:22}})     #添加小亮年龄22

查询 age 取模7等于4的文档:

db.hobbies.find({age:{$mod:[7,4]}})

查询结果如如图4所示::

图4

图 4

$in 包含

查询 age =17或 age =20的文档 :

db.hobbies.find({age:{$in:[17,20]}})

查询结果如图5所示:

图5

图 5

 
$nin 不包含

查询 age !=17且 age !=20的文档:

db.hobbies.find({age:{$nin:[17,20]}})

查询结果如图6所示:

图6

图 6

$size 数组元素个数

可以查询特定长度的数组,比如 hobbies 这一字段,查询有两个爱好的文档:

db.hobbies.find({hobbies:{$size:2}})

查询结果如图7所示:

图7

图 7

查询结果排序

查询结果排序语法如下:

db.collection.find().sort({_id:1})     #将查询结果按照_id升序排序
db.collection.find().sort({_id:-1})    #将查询结果按照_id降序排序
编程要求

现有 person.json 文件内容如下:

_idnameagesexhobbies
1杨璐19唱歌,跳舞
2李建学20唱歌,篮球
…………………………

在命令行进行操作:

  • 将 /home/example/person.json 文件导入到数据库 mydb2 中的 test 集合中。

在右侧代码行 Begin-End 中编辑:

  • 执行查询命令,查找所有喜欢唱歌和跳舞的人的信息,并按照_id升序排序;

  • 执行查询命令,查找所有喜欢羽毛球和跳舞的人的信息,并按照_id升序排序;

  • 执行查询命令,查找有3个爱好的人的信息,并按照_id升序排序;

  • 执行查询命令,查找文档中存在 hobbies 字段的人的信息,并按照_id升序排序;

  • 执行查询命令,查找19岁和23岁的人的信息,并按照_id升序排序;

  • 执行查询命令,查找不是20岁的人的信息,并按照_id升序排序;

  • 执行查询命令,查找 age 取模9等于2的人的信息,并按照_id升序排序。

注意:上述操作共有七条命令,每条命令以号隔开(由于测试需要,请在$前加\(转义符),即使用\$,平时在命令窗口练习不需要加\;不要使用双引号改用 单引号)。

mongoimport -d mydb2 -c test --type json --file /home/example/person.json 
echo “db.test.find({hobbies:{\$all:[‘唱歌’,’跳舞’]}}).sort({_id:1});
db.test.find({hobbies:{\$all:[‘羽毛球’,’跳舞’]}}).sort({_id:1});
db.test.find({hobbies:{\$size:3}}).sort({_id:1});
db.test.find({hobbies:{\$exists:true}}).sort({_id:1});
db.test.find({age:{\$in:[19,23]}}).sort({_id:1});
db.test.find({age:{\$nin:[20]}}).sort({_id:1});
db.test.find({age:{\$mod:[9,2]}}).sort({_id:1});”

 三、高级查询(二)

任务描述

本关任务:根据编程要求完成文档查询。

相关知识

为了完成本关任务,你需要掌握:各种查询操作符的用法。

假设数据库有集合 student 如下:

_idnameagesexmajor
1王晓丽19计算机
2张明21计算机
3秋雅20播音主持
4张欣欣18表演
$or 条件之间的或查询

$or 表示多个查询条件之间是或的关系,比如查询性别 sex 为 男 或年龄 age 为18的文档信息:

db.student.find({$or:[{sex:"男"},{age:18}]})

查询结果,如图1所示:

图1

图 1

 
$and 条件之间的且查询

$and表示多个查询条件之间是且的关系,比如查询年龄 age 大于18且小于21(18 < age < 21)的信息:

db.student.find({$and:[{age:{$gt:18}},{age:{$lt:21}}]})

查询结果,如图2所示:

图2

图 2

$not 条件取反查询

$not 用来执行取反操作,比如查询年龄 age 大于等于20岁,然后进行取反(即查询年龄小于20岁的文档):

db.student.find({age:{$not:{$gte:20}}})

查询结果,如图3所示:

图3

图 3

正则表达式匹配查询

查询不符合major=计*开头文档:

db.student.find({major:{$not:/^计.*/}})

查询结果,如图4所示:

图4

图 4

count() 返回结果集总数

比如返回上一步正则查询到的结果集有几条:

db.student.find({major:{$not:/^计.*/}}).count()

查询结果,如图5所示:

图5

图 5

编程要求

现有 person.json 文件内容如下:

_idnameagesexhobbies
1杨璐19唱歌,跳舞
2李建学20唱歌,篮球
…………………………

在右侧命令行进行操作:

  • 将 /home/example/person.json 文件导入到数据库 mydb3 中的 test 集合中。

在右侧代码行 Begin-End 中编辑,如下:

  • 执行查询命令,查找年龄为20岁男生的信息,并按照_id升序排序;

  • 执行查询命令,查找年龄为20岁或者性别为男生的信息,并按照_id升序排序;

  • 执行查询命令,查找name = 韩*开头的人的信息,并按照_id升序排序;

  • 执行查询命令,查找年龄19 =< age < 22的人的信息,并按照_id升序排序;

  • 执行查询命令,查找年龄age < 19age >21的信息,并按照_id升序排序;

  • 执行查询命令,查找name != 韩*开头的人的信息,并按照_id升序排序;

  • 执行查询命令,查找查找name != 韩*开头的人的个数;

  • 执行查询命令,查找年龄19 =< age < 22的人的个数。

注意:上述操作共有八条命令,每条命令以号隔开(由于测试需要,请在$前加\(转义符),即使用\$,平时在命令窗口练习不需要加\;不要使用双引号改用 单引号)。

#********* Begin *********#
echo "
db.test.find({'age': 20, 'sex': '男'}).sort({_id: 1});
db.test.find({\$or: [{age: 20}, {sex: '男'}]}).sort({_id: 1});
db.test.find({name: /^韩/}).sort({_id: 1});
db.test.find({age: {\$gte: 19, \$lt: 22}}).sort({_id: 1});

db.test.find({\$or:[{age:{\$lt:19}},{age:{\$gt:21}}]}).sort({_id:1});
db.test.find({name: {\$not: /^韩/}}).sort({_id: 1});
db.test.count({name: {\$not: /^韩/}});
db.test.count({age: {\$gte: 19, \$lt: 22}});
"
#********* End *********#

四、游标

任务描述

本关任务:按照编程要求在命令行进操作,使用游标插入文档。

相关知识

db.collection.find() 可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标,可以随意修改查询限制、跳跃、和排序顺序的功能。

为了完成本关任务,你需要掌握: 1.什么是游标; 2.如何使用游标。

什么是游标

通俗的说,游标不是查询结果,而是查询的返回资源,或者接口。通过这个接口,你可以逐条读取。就像 fopen 打开文件,得到一个资源一样,通过资源,可以一行一行的读文件。

使用循环插入数据

我们首先插入10000条数据到集合 items,因为 mongodb 底层是 javascript 引擎,所以我们可以使用 js 的语法来插入数据:

for(var i=0;i<10000;i++)db.items.insert({_id:i,text:"Hello MongoDB"+i})

插入后查看效果,如图1所示:

图1

图 1

声明游标

定义一个变量来保存这个游标,find 的查询结果(_id<=5)赋值给了游标 cursor 变量,代码如下:

var cursor=db.items.find({_id:{$lte:5}})
打印游标中的数据信息

有四种方法进行打印:

  • printjson(cursor.next()) 打印下一条数据,如图 2 所示:

图2

图 2

 

注意:当取完游标中的数据,又进行打印,会报错。

  • 使用 js 的 while 语法来循环打印,具体步骤如图 3 所示:

图3

图 3

 
  • 使用 for 循环打印,具体步骤如图 4 所示:

    图4

    图 4

  • 使用 forEach 打印,具体步骤如图 5 所示:

图5

图 5

游标的使用场景

我们可以在分页的情况下使用游标。

假设每页有10行,我们查询第701页,可以配合 skip() 和 limit() 来实现,具体步骤如图6所示:

图6

图 6

 

如果不想全部取出,只取出某一个,可以使用如下方法,取出数组下标,具体步骤如图7所示:

图7

图 7

 
编程要求

在命令行进行以下操作:

  • 在数据库 mydb4 中,向集合 test 循环插入 10000 条数据,格式如下:
_idtitlecontent
1MongoDB1hello1
2MongoDB2hello2
3MongoDB3hello3
………………
  • 将集合 test 以 csv 格式导出到 /home/test/test4.csv 文件中。

打印游标中的数据信息请自行练习尝试,测评不做要求。

> use mydb4
switched to db mydb4
> for(var i=0;i<10000;i++)db.test.insert({_id:i,title:"MongoDB"+i,content:"hello"+i})
WriteResult({ "nInserted" : 1 })
> exit
bye
root@evassh-12318384:~# mongoexport -d mydb4 -c test -o /home/test/test4.csv --type csv -f "_id,title,content"
2022-09-29T00:42:15.346+0000    connected to: localhost
2022-09-29T00:42:15.427+0000    exported 10000 records

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字乡村可视化大数据-DIY拖拽式设计

DIY拖拽式大数据自由设计万村乐可视化大数据V1.0 随着万村乐数字乡村系统的广泛使用&#xff0c;我们也接收到了客户的真实反馈&#xff0c;最终在公司的决定下&#xff0c;我们推出了全新的可视化大数据平台V1.0版本&#xff0c;全新的可视化平台是一个通过拖拽配置生成可视化…

springboot+vue高校贫困生资助勤工俭学管理系统python

本次开发一套贫困生资助管理系统有管理员和用户两个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;院校管理&#xff0c;贫困申请管理&#xff0c;资助项目管理&#xff0c;资助申请管理&#xff0c;资助发放管理&#xff0c;勤工俭学管理&#xff0c;岗位申请管…

海外媒体发稿:新加坡 Asia One VS新加坡sg雅虎

海外媒体发稿&#xff1a;新加坡 Asia One VS新加坡sg雅虎 新加坡&#xff1a;雅虎 官网&#xff1a;sy.yahoo.com 官网&#xff1a;asiaone.com/lite 亚洲第一站。是 新加坡的新闻和生活方式网站和新闻聚合器。它是 新加坡第一个纯数字 内容平台&#xff0c;主要为新加坡、…

下线圈和包扎

电机槽内放好 所有槽纸 槽内再放入引槽纸 作用是放线圈的时候避免划伤线 开始放线圈 绑了白色扎带的朝外面 线圈的一边放进去后&#xff0c;另一边还悬在外面 &#xff0c;这里俗称 吊边。 为了保护吊边 &#xff0c;在吊边处放一张大的绝缘纸 &#xff08;如下图&#xff0…

详细介绍微信小程序app.js

这一节&#xff0c;我们详细介绍app.js 这个文件。这个文件的重要性我就不再赘述&#xff0c;前面已经介绍了。 一、app.js是项目的主控文件 任何一个程序都是需要一个入口的&#xff0c;就好比我们在学c的时候就会有一个main函数&#xff0c;其他语言基本都是一样。很明确的…

CST软件中变更求解器和宏的使用技巧【操作教程】

变更求解器 变更CST MWS中的Solver&#xff01; Home > Simulation > Setup Solver CST Microwave Studio (CST MWS)总共有六个Solver。用户根据仿真目的和应用方向选择合适的Solver&#xff0c;才可以快速获得准确的结果。变更或选择Solver时&#xff0c;在Setup Sol…

LeetCode-Java:6.Z字形变换

文章目录 题目解① 找规律 题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R之后&a…

强化学习基础概念入门

文章目录 1. 什么是强化学习&#xff1f;2. 强化学习的基本元素3. 相关衍生元素3.1 策略(Policy)3.2 状态转移(State Transition)3.3 回报(Return)3.4 价值函数(Value Function) 4. 算法分类4.1 按环境是否已知划分4.2 按学习方式划分4.3 按学习目标划分 参考资料 1. 什么是强化…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐&#xff08;Alignment&#xff09;与缩进&#xff08;indent&#xff09; 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…

ELK-Kibana 部署

目录 一、在 node1 节点上操作 1.1.安装 Kibana 1.2.设置 Kibana 的主配置文件 1.3.启动 Kibana 服务 1.4.验证 Kibana 1.5.将 Apache 服务器的日志&#xff08;访问的、错误的&#xff09;添加到 ES 并通过 Kibana 显示 1.6. 浏览器访问 二、部署FilebeatELK&…

数学建模-Matlab中randperm函数及其双重进阶版

1.randperm函数的用法 &#xff08;1&#xff09;这种用法就是参数只有一个数字&#xff0c;代表的含义就是随机排列之后打印输出&#xff1b; 我们举例的数字是4&#xff0c;就会把1到4这4个数字随机打乱之后随机输出&#xff0c;每次运行结果都不一样 所有可能的情况是n的…

五一假期干什么赚钱多?假期怎么赚钱又快乐,而不是全家去花钱出去玩买快乐?

兄弟们&#xff0c;赚钱的机会来了&#xff01;&#xff01;&#xff01; 五一假期可以考虑以下方式赚钱&#xff1a; 旅游服务&#xff1a;提供导游、翻译等旅游相关服务。手工艺品销售&#xff1a;制作手工艺品并在旅游景点或线上销售。线上兼职&#xff1a;寻找在线兼职工…

一文搞懂交换机 MAC PHY 网络变压器!

21.交换机 MAC PHY 网络变压器 1.交换机 没有IP路由功能、仅处理数据链路层的交换机叫做二层交换机。 带有IP路由功能的交换机叫做三层交换机。 交换机与路由器的区别&#xff1a; 1.工作层次不同 &#xff1a;交换机主要工作在数据链路层&#xff08;第二层&#xff09; …

前端开发攻略---用JavaScript打造炫酷数字变化动画效果:手写实现你的自定义动画函数!支持更改任意数字、动画速度

1、演示 2、介绍 这篇文章将向您展示如何使用JavaScript来创建一个自定义的动画函数&#xff0c;以实现数字变化效果。我们将深入了解前端动画的本质&#xff0c;并通过手写代码来实现这个炫酷的数字变化动画效果。您将学到如何利用JavaScript来操作DOM元素&#xff0c;控制动画…

FPGA基于VCU的H265视频解压缩,解码后HDMI2.0输出,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案4K60帧HDMI2.0输入&#xff0c;H265视频压缩方案 3、详细设计方案设计框图FPGA开发板解压视频源Zynq UltraScale VCUVideo Frame Buffer ReadVideo MixerHDMI 1.4/2.0 Transmitter SubsystemVideo PHY Cont…

ARM内核、内核寄存器及作用、ARM最小系统、半导体器件、存储器、ARM工作方式、ARM寄存器个数、立即数、汇编指令的s/c后缀

我要成为嵌入式高手之4月10日51单片机第五天&#xff01;&#xff01; ———————————————————————————— 单片机最小系统板&#xff1a; 单片机内部的CPU&#xff1a; CPU定义的变量都在ram中、编写的程序代码都在rom中 CPU在次细化&#xff1a;ker…

计算机导论——C语言001

前言 学习一门语言不是要记住所有这些函数&#xff0c;而是要懂得在哪里找到解决问题的答案 学习英语不是要记住所有单词&#xff0c;而是要懂得查字典&#xff08;因为这样就可以理解单词&#xff0c;并会用单词造句子了&#xff09; 以下侧重于了解输出&#xff08;side eff…

new Ammo.btSoftBodyHelpers() 是 Ammo.js 中的一个构造函数,用于创建软体物体的辅助对象,提供了一些方法来创建软体物体

demo案例 new Ammo.btSoftBodyHelpers() 是 Ammo.js 中的一个构造函数&#xff0c;用于创建软体物体的辅助对象&#xff0c;提供了一些方法来创建软体物体。以下是它的一些重要信息&#xff1a; 入参&#xff1a;通常不需要传入参数。 出参&#xff1a;创建的新的软体辅助对…

软件设计师-基础知识科目-面向对象技术知识7

七、面向对象技术知识&#xff1a; 面向对象基础知识&#xff1a; 对象&#xff1a; 对象的组成部分包括&#xff1a;对象名&#xff0c;状态(属性)&#xff0c;行为(操作)。 类&#xff1a; 类的分类&#xff1a;实体类、接口类(边界类)和控制类。 实体类的对象&#xff…

CentOS7 boa服务器的搭建和配置

环境是CentOS7&#xff0c;但方法不局限于此版系统&#xff0c;应该是通用的。 具体步骤如下&#xff1a; 1. 下载boa源码 下载地址: Boa Webserver 下载后&#xff0c;进入压缩包所在目录&#xff0c;进行解压&#xff1a; tar xzf boa-0.94.13.tar.gz 2. 安装需要的工具b…