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

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

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

相关文章

【Linux学习】初识Linux指令(一)

文章目录 1.指令操作与图形化界面操作1.什么是指令操作&#xff0c;什么是图形化界面操作&#xff1f; 2.Linux下基本指令1.Linux下的复制粘贴2.Linux两个who命令3.补充知识4.pwd指令5. ls 指令6.cd 指令1.目录树2.相对路径与绝对路劲3.常用cd指令 7.tree指令8. touch指令9.sta…

从浅入深理解JAVA异常

从浅入深理解JAVA异常 一、什么是异常以及异常的分类二、异常的分类1、常见的系统错误2、常见的编译时异常3、常见的运行时异常 三、创建异常1、创建JAVA中已经存在的异常 -- throw关键字1.1 语法1.2 使用2、自定义异常&#xff08;1&#xff09;区分你要创建哪种异常&#xff…

volatile 关键字

我们先看这段代码 class MyCounter {public int flag 0; }public class ThreadDemo15 {public static void main(String[] args) {MyCounter myCounter new MyCounter();Thread t1 new Thread(() -> {while (myCounter.flag 0) {// 这个循环体咱们就空着}System.out.pr…

平板设备IP地址设置指南

在数字化时代&#xff0c;平板电脑作为便携且功能强大的设备&#xff0c;广泛应用于日常生活和工作中。为了确保平板能够正常接入网络并与其他设备进行通信&#xff0c;正确设置IP地址是至关重要的。虎观小二将为您介绍如何设置平板的IP地址&#xff0c;帮助您轻松完成网络配置…

JavaScript ECMAScript标准的与时俱进:从ES6至ES14的革新之路与关键技术特性剖析

ECMAScript&#xff08;通常缩写为ES&#xff09;是一种标准化的脚本语言规范&#xff0c;由ECMA International&#xff08;前身为European Computer Manufacturers Association&#xff0c;欧洲计算机制造商协会&#xff09;制定。自1997年发布首个版本以来&#xff0c;ECMAS…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

PAN1026蓝牙收发芯片

1 概述 PAN1026 系列产品是一款低成本、高集成度的无线 BLE 数据收发芯片&#xff0c;工作在射频 2400MHz ~2483MHz 的通用 ISM 频段。具有较低的系统应用成本&#xff0c;只需要一个 MCU 和少量外部无 源组件即可构建满足无线应用的系统。同时&#xff0c;操作方式非…

七大免费SSL证书获取方法

为了保护用户数据的安全&#xff0c;越来越多的网站开始使用SSL证书。SSL证书是一种数字证书&#xff0c;它能够为网站提供一个安全的加密连接&#xff0c;从而保护用户的敏感信息。然而&#xff0c;购买SSL证书需要一定的费用&#xff0c;这对于一些小型企业或个人来说可能是一…

C++ | Leetcode C++题解之第23题合并K个升序链表

题目: 题解&#xff1a; class Solution {// 21. 合并两个有序链表ListNode *mergeTwoLists(ListNode *list1, ListNode *list2) {auto dummy new ListNode(); // 用哨兵节点简化代码逻辑auto cur dummy; // cur 指向新链表的末尾while (list1 && list2) {if (list1…

test4121

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

强化学习基础概念入门

文章目录 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. 什么是强化…

本地开发nginx代理服务器(2024-04-10)

1、nginx 解释 nginx 是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。 在性能上&#xff0c;Nginx占用很少的系统资源&#xff0c;能支持更多的并发连接&#xff0c;达到更高的访问效率&#xff1b; 在功能上&#xff0c;Nginx是优…

QT:QMainWindow、ui界面、资源文件的添加、信号和槽

1.练习&#xff1a;使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(…

OJ 古籍翻译 【进制转化】【C】

这里有两个考察点&#xff0c;一个是进制转换&#xff0c;还有一个是以字符串输出 知识点&#xff1a; sprintf(参数一&#xff0c;参数二&#xff0c;参数三) 将参数三按参数二的格式转换后存入参数一中 sprintf与printf用法基本一样&#xff0c;只是sprintf是将值打印到指…

SketchBook2014 下载地址及安装教程

SketchBook是一款专业级别的绘图与绘画软件。它提供了丰富的绘画工具和创意功能&#xff0c;适用于艺术家、插画师、设计师和数字艺术爱好者。SketchBook具有直观的用户界面&#xff0c;简单而强大的绘制工具&#xff0c;能够帮助用户在数字平台上创造出精美的艺术作品。 Sket…

哪些工作不会被AI替代:人类能力地形图

这一轮AI&#xff0c;到底对人有多强的替代性&#xff1f;这一轮AI的可靠性&#xff0c;是之前任何一代所谓的人工智能都不能比的。 在国内&#xff0c;AI开始被用来筛选简历&#xff0c;而在国外&#xff0c;亚马逊正在用算法跟踪仓库工人的生产率&#xff0c;顺道还会给生产率…

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例&#xff0c;我删除了一些没用的注释&#xff0c;然后对代码做了一下注释的翻译&#xff0c;可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

RocketMQ之Topic和Tag最佳实践

一、Topic是什么&#xff1f;它的作用&#xff1f; Topic即主题&#xff0c;是消息队列中用于对消息进行分类和组织的一种机制&#xff0c;它有以下三种作用&#xff1a; 标识消息分类&#xff1a;RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题…

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…

2024Mathorcup(妈妈杯)数学建模C题python代码+数据教学

2024Mathorcup数学建模挑战赛&#xff08;妈妈杯&#xff09;C题保姆级分析完整思路代码数据教学 C题题目&#xff1a;物流网络分拣中心货量预测及人员排班 因为一些不可抗力&#xff0c;下面仅展示部分代码&#xff08;很少部分部分&#xff09;和部分分析过程&#xff0c;其…