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

数据库存储了大量的数据,当我们需要特定的数据时就要使用查询方法,根据一定的条件,筛选出我们想要的数据,前一章我们简单介绍了条件操作符(<<=>>=!=等),在这一章中我们将更全面地介绍 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.mzph.cn/news/810438.shtml

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

相关文章

重生奇迹MU弓箭手装备介绍

重生奇迹MU弓箭手装备搭配什么好呢&#xff1f;装备的搭配对于角色来说帮助很大&#xff0c;所以我们更加要选择合适的装备来搭配。 装备打造 ①装备强化&#xff1a;装备强化需要强化材料 灵魂宝石、祝福宝石、玛雅宝石&#xff0c;强化有几率失败&#xff0c;失败不会导致…

贪心算法|968.监控二叉树

力扣题目链接 class Solution { private:int result;int traversal(TreeNode* cur) {// 空节点&#xff0c;该节点有覆盖if (cur NULL) return 2;int left traversal(cur->left); // 左int right traversal(cur->right); // 右// 情况1// 左右节点都有覆盖if (le…

tcpdump简介

tcpdump tcpdump 简介参数options举例参考文章 简介 不通平台的 tcpdump 支持的参数是不一样的 比如 windows 下的 tcpdump 就不支持 -i 参数 有些嵌入式设备&#xff0c;只支持 -i -w 参数等 一般只用tcpdump进行过滤抓包&#xff0c;然后使用 wireshark 进行解析 表达…

MM-Grounding-DINO的训练推理(待更新)

1、简单介绍 继前面发布的 GroundingDino 和 Open-GroundingDino的推理 和 Open-GroundingDino的训练实现&#xff0c;作为 GroundingDino延续性的文本检测网络 MM-Grounding-DINO 也发布了较详细的 训练和推理实现教程&#xff0c;而且操作性很强。作为学习内容&#xff0c;也…

IO流【内存流、打印流、随机访问流】;初识网络编程

day37 IO流 继day36 各种流 对象流 day36 内存流 class ByteArrayInputStream – 内存输入流 class ByteArrayOutputStream – 内存输出流 注意&#xff1a; 内存流是程序和内存交互&#xff0c;跟文件无关内存流是程序到内存的通道&#xff0c;是关闭不掉的 应用场景&#x…

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f 华为modelArtshttps://bbs.huaweicloud.com/forum/thread-76328-1-1.html…

阿里云飞燕平台搭建与linux程序通信(全图文教程)

阿里云飞燕平台搭建与linux程序通信&#xff08;全图文教程&#xff09; 一、MQTT理论1.1 概念1.2 理解发布和订阅1.3 MQTT传输的消息组成 二、阿里云飞燕平台搭建2.1 产品创建2.2 自定义自己的功能2.3 人机交互 三、测试3.1代码分析3.2 效果验证 一、MQTT理论 1.1 概念 MQTT…

vue3从精通到入门17:内置组件之Transition和TransitionGroup

Transition <Transition> 是一个内置组件&#xff0c;它用于在元素或组件的插入、更新和移除时应用过渡效果。Vue 3 的 <Transition> 组件提供了一个声明式的方式来处理这些过渡效果&#xff0c;使开发者能够更容易地添加动画到他们的 Vue 应用中。 基本概念 包裹…

蓝桥杯每日一题:鱼塘钓鱼(多路归并)

题目描述&#xff1a; 有 N 个鱼塘排成一排&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5 时&#xff0c;如下表&#xff1a; 鱼塘编号12345第1分钟能钓到的鱼的数量&#xff08;1..1000&#xff09;101420169每钓鱼1分钟钓鱼数的减少量&#xff08;1…

指针的总结

公司面试题 定义&#xff1a; 1.一个整型数&#xff1a;int a; 2.一个指向整型数的指针&#xff1a;int *a 3.一个指向指针的 (指针)&#xff0c;它 (指向的指针) 指向一个整型数:int **a 4.一个有10个整型数的数组 : int a[10]; 5.一个有10个指针的数组&#xff0c;每个…

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…

高阶函数,前端切片处理提升用户体验,代码复制即用

使用范围ALL /*** 高阶函数之数组切片* M楸M 前言* 好处: 解决页面卡顿加载缓慢问题* 常用于渲染真实dom节点数据量大问题* 从根源上去处理这个问题 页面卡顿基本原因是主线程阻塞16.6ms渲染一次* 在16.6毫秒间分段处理* **/ function performChunk(data, taskHandler, schedu…

边缘计算平台原理、关键功能以及技术优势

1、什么是边缘计算及其工作原理&#xff1f; 边缘计算是一种分布式计算模型&#xff0c;它将数据处理和存储靠近数据源头和最终用户的边缘设备上&#xff0c;从而减少了数据传输和延迟。边缘计算旨在解决云计算模型所面临的问题&#xff0c;例如延迟高、带宽瓶颈和安全性等问题…

【前端性能优化】使用惰性函数减少无意义的重复判断

什么是惰性函数&#xff1f; 惰性函数表示函数执行的分支只会在函数第一次调用的时候执行&#xff0c;在第一次调用过程中&#xff0c;该函数会被覆盖为另一个按照合适方式执行的函数&#xff0c;这样任何对原函数的调用就不用再经过执行的分支了。 惰性函数的本质就是函数重…

【JavaWeb】Day38.MySQL概述——数据库设计-DQL(一)

数据库设计——DQL 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 查询关键字&#xff1a;SELECT 查询操作是所有SQL语句当中最为常见&#xff0c;也是最为重要的操作。在一个正常的业务系统中&#xff0c;查询操作的使用频次…

Python实现BOA蝴蝶优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

synchronized用于静态方法与普通方法有区别吗?

Synchronized 关键字在 Java 中用于实现线程同步&#xff0c;确保在多线程环境下对共享资源的访问是安全的。当应用于方法时&#xff0c;它可以用于静态方法和普通方法&#xff0c;但二者之间确实存在一些区别。 锁的对象不同&#xff1a; 对于普通方法&#xff0c;锁的对象是调…

3.13 Python位运算符

Python位运算符详解 Python位运算按照数据在内存中的二进制位&#xff08;Bit&#xff09;进行操作&#xff0c;它一般用于底层开发&#xff08;算法设计、驱动、图像处理、单片机等&#xff09;&#xff0c;在应用层开发&#xff08;Web 开发、Linux 运维等&#xff09;中并不…

神经网络训练中batch的作用

在神经网络训练中&#xff0c;batch的作用主要包括以下几个方面&#xff1a; 减少内存占用和计算成本&#xff1a;在训练神经网络时&#xff0c;需要加载并处理大量的数据。使用batch训练可以将数据分成较小的批次&#xff0c;每次处理一小部分数据&#xff0c;从而减少内存占用…

数据库讲解---(SQL语句--练习题讲解)【MySQL版本】

目录 零.前言 一.例题一 1.1查询姓刘的老师所授课程的课程号和课程名 1.2查询年龄大于23岁的男同学的学号和姓名 1.3查询学号为S3的学生所学课程的课程号、课程名和任课教师姓名 1.4查询“张小飞”没有选修的课程号和课程名 1.5查询至少选修了三门课程的学生的学号和姓名…