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…

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…

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…

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

1、什么是边缘计算及其工作原理&#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年提出的一种元启发式智能算…

cmake + mingw32构建和编译第三方lib库, qt 使用lib库

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 背景 qt 有两种编译器&#xff0c;分别是visual studio和MinGW。很多第三方库提供编译好的visual studio 库&#xff0c;MinGW库需要自己编译。喜欢MinGW没有太多版本…

vs2022启动cmake项目(qt+c++)

1.本工程&#xff0c;如图&#xff0c;1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面&#xff0c;就说明配置没问题 5.启动 6.最后会自己生成其他文件

Proteus 8 的使用记录

创建仿真文件 新建文件&#xff1a;默认下一步&#xff0c;至完成创建。 功能选择如图&#xff1a; 放置器件 常用元器件名称 keywords 常用51单片机 AT89C52 晶振 CRYSTAL 电阻 RES 排阻 RESPACK-8 瓷片电容 CAP 电解电容 CAP-ELEC 单刀单掷开关 S…

网络协议学习——以太网协议

目录 ​编辑 一&#xff0c;以太网简介 二&#xff0c;以太网通信的过程 为什么不用IP地址&#xff1f; 过程 MAC帧 MAC帧的字段介绍 ARP协议 传输过程的一些问题 RARP协议 提高效率 三&#xff0c;其他问题 ARP诈骗问题 URL解析过程 一&#xff0c;以太网简介 …

python图书馆图书借阅系统含网上商城管理系统7d538

&#xff0c;python语言&#xff0c;django框架进行开发&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发的图书管理系统。通过调研和分析&#xff0c;系统拥有管理员和用户两个角色&#xff0c;主要具备注册登录、个人信息修改、用户、图书分类、图书信息、借…

Django交易商场

Hello&#xff0c;我是小恒不会java 最近学习django&#xff0c;写了一个demo,学到了不少东西。 我在GitHub上开源了&#xff0c;提示‘自行查看代码&#xff0c;维护&#xff0c;运行’。 最近有事&#xff0c;先发布代码了&#xff0c;我就随缘维护更新吧 介绍&#xff1a; 定…

构建智能生态:详解同城O2O外卖跑腿APP的开发技术

同城O2O外卖跑腿APP作为这一新型服务的代表&#xff0c;其开发技术成为了当下技术界的热点之一。小编将深入讲解同城O2O外卖跑腿APP的开发技术&#xff0c;以期为开发者提供一些有益的参考和指导。 需求分析与功能设计 在开发同城O2O外卖跑腿APP之前&#xff0c;首先需要进行充…

如何更换网络IP地址,简单几步轻松搞定

在数字化日益普及的今天&#xff0c;网络IP地址作为设备在网络中的标识&#xff0c;扮演着极其重要的角色。有时&#xff0c;出于安全考虑、网络布局调整或解决特定问题的需要&#xff0c;我们可能需要更换网络IP地址。虎观代理将详细介绍如何更换网络IP地址&#xff0c;帮助用…

LeetCode-152. 乘积最大子数组【数组 动态规划】

LeetCode-152. 乘积最大子数组【数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动态规划五部曲&#xff1a;定推初遍举解题思路二&#xff1a;因为每一个状态只与前一个状态有关&#xff0c;可以使用「滚动变量」技巧&#xff0c;使用常数个变量完成这道问题。解…

2024年MathorCup数模竞赛C题超详细解题思路

妈妈杯本次比赛报名队伍号高达12500&#xff0c;这也就意味着大概一万只队伍参加报名&#xff0c;仅仅在报名人数这一项&#xff0c;妈妈杯已经成为美赛国赛之后的第三大竞赛。C题作为本次竞赛最简单也最容易获奖的题目&#xff0c;本文将给大家带来手把手超详细解题思路。 注…