MongoDB实验——在MongoDB集合中查找文档

在MongoDB集合中查找文档

一、实验目的

1.掌握在 MongoDB中查询文档操作

2.掌握查找单个文档、多个文档、使用查询运算符根据字段值查找文档,根据子文档查找文档的方法

二、实验原理

MongoDB 支持多种复杂的查询方式,能实现大多数 T-SQL 功能,远不是 Key-Value 之类的 NoSQL DB 所能比拟的。

Conditional Operator : lt \<, lte <=, gt \>, gte >=

Conditional Operator : $ne //不等于

Conditional Operator : $in //属于

Conditional Operator : $nin //不属于

Conditional Operator : $mod //取模运算

Conditional Operator : $all //全部属于

Conditional Operator : $size //数量

Conditional Operator : $exists //字段存在

Conditional Operator : $or // 或

Regular Expressions //正则表达式

Value in an Array // 数组中的值

Conditional Operator : $elemMatch //要素符合

Meta operator: $not //不是

Conditional Operators : $slice //切片

Javascript Expressions and $where //

sort() //排序

limit() //限制取数据条数

skip() //跳过一定数值开始取

count() // 数量

group() //分组

三、实验步骤

1.启动MongoDB数据库、启动MongoDB Shell客户端

2.数据准备-->person.json

2.1切换到 xscj 数据库,Shell 端执行以下脚本:实现在 xscj 数据库中,添加 persons 集合,并增加11条学生信息。

2.2查询persons集合中的所有文档信息

2.3查询persons集合中的所有文档信息(规整查找结果的格式)------节选一部分

3.指定返回的键

格式为:db.[documentName].find({条件},{键指定})

3.1查询出所有学生的name、age和country信息

3.2查询出年龄在 25 到 27 岁之间的学生姓名。

3.3查询出所有不是韩国籍的学生的数学成绩,结果显示姓名和数学成绩。

4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch(匹配数组)

4.1查询国籍是中国或美国的学生信息

4.2查询国籍不是中国或美国的学生信息

4.3查询出满足数组中指定条件的文档

步骤一:在当前数据库中添加数据到 scores 集合中{_id: 1, results: [82,85,88] },{ _id: 2, results: [75,88,89]}

步骤二:查询 89<=results<95 的文档

5.OR 查询 $or

查询语文成绩大于 85 或者英语大于 90 的学生信息,结果显示学生姓名,语文成绩和英语成绩。

6.Null、$exists

  1. 1把中国国籍的学生上增加新的键 sex

6.2查询出sex等于null的学生

6.3查询集合中包含sex键的文档

6.4查询集合中不包含sex键的文档

7.正则查询 $regex

正则表达式对象:{ <field>: /pattern/<options> };

$regex 为模糊查询的字符串提供正则表达式功能。

7.1查询出名字中存在"li"的学生的信息

7.2分析以下查询实现的操作,在当前数据库 xs 集合中录入实例数据检验其功能。

`> db.xs.find({name:{$in:[/^joe/i,/^jack/}})

`> db.xs.find({name:{$regex:/^zh/i, $nin:["zhang"]}})

`> db.xs.find({email:{$regex:/@qq./,$options:"i"}})

```> db.xs.find({name:{$regex:/^zh/}})`

`> db.xs.find({name:{$regex:/c/}})

8.$not 的使用

$not 可以用到任何地方进行取反操作。

查询出名字中不存在"li"的学生的信息。

n o t 和 not 和 not和nin 的区别是 n o t 可以用在任何地方,而 not 可以用在任何地方,而 not可以用在任何地方,而nin 用到集合上。

9.数组查询$all 和 index 应用

9.1查询喜欢看MONGODB和JS的学生

9.2 查询第二本书是 JAVA 的学习信息

10.查询指定长度数组$size,它不能与比较查询符一起使用

查询出喜欢的书籍数量是 4 本的学生

11.查询出喜欢的书籍数量大于 4 本的学生

  1. 1增加字段 size

11.2改变书籍的更新方式,每次增加书籍的时候 size 增加 1

11.3利用$gt 查询: 喜欢的书籍数量大于4 本的学生

12.利用shell查询出Jim喜欢看的书的数量

13.在当前数据库 persons1 集合中中添加以下文档信息:

{ _id:1,

members:[{name:"BuleRiver1",age:27,gender:"M"},

{name:"BuleRiver2", age:23, gender:"F"},

{name:"BuleRiver3", age:21, gender:"M"}]

}

查看数据是否正确存储到数据库?

查询是否存在 name 为"BuleRiver1"并且 age 为 27 的成员。使用多种方式尝试查询:(分 析哪种查询可以得到正确结果)

> db.persons1.find({members:{name:"BuleRiver1"}}) //数组元素中的键值一部分

> db.persons1.find({members:{age:27,name:"BuleRiver1",gender:"M"}})

//把键值颠倒

> db.persons1.find({members:{name:"BuleRiver1",age:27,gender:"M"}})

//完全匹配数组中的键值

> db.persons1.find({"members.name":"BuleRiver1"})

> db.persons1.find({"members.name":"BuleRiver1","members.age":27})

//数组第 1 个元素的键值完全一致

> db.persons1.find({"members.name":"BuleRiver1","members.age":23})

//数组第 1、2 个元素的部分键值的组合

使用$elemMatch 操作符查询

> db.persons1.find({members:{$elemMatch:{name:"BuleRiver1",age:27}}})

//$elemMatch+同一个元素中的键值组合

> db.persons1.find({members:{$elemMatch:{name:"BuleRiver1",age:23}}})

//$elemMatch+不同元素中的键值组合

14.$slice 操作符返回文档中指定数组的内部值

14.1查询出Jim书架中第2~4本书

14.2查询出最后一本书,注意查询结果同时显示姓名和图书

14.3$slice 值设置为 2 或-2,分析查询结果

15.嵌套文档查询

为 zhangsan 添加学习简历文档 zhangsanschoool.json。

文档内容:

15.1查询出在 school1 上过学的且成绩为"A"学生

15.2查询出在 school1 上过学的且成绩为"B"学生

15.3查询年龄大于 22 岁,喜欢看 C++书,在 school1 学校上过学的学生信息

mysql 复制代码
db.persons.find( 
{"school.school":"school1","books":{$in:["C++"],"age":{$gt:22}},{_id:0,name:1}}) 

16.分页和排序

16.1分页 前几条数据limit()

查询persons中的前5条数据

16.2前跨度数据------skip()

查询persons中的前6~8共三条数据,即前面5条省略跳过

16.3排序------sort()

查询 persons 集合中的前三行数据,只显示姓名和年龄,根据 name 升序排序,-1 为倒序

17.游标

查询学生集合中的所有文档

> var p = db.persons.find(); //得到游标

> while(p.hasNext()){ //遍历游标

> obj = p.next(); //指向下一条记录

> print(obj); //输出

>}

18.Count函数------计数

查询美国国籍的人数

19.Distinct函数------去重

查询 persons 集合中一共有多少个国家,分别是什么

20.嵌套文档查询

查询在"school1"学校上过学的学生

注意:通过"."连接集合 baseinf 和字段,并用双引号实现指定嵌套文档的查询

查询在"school1"学校上过学且成绩为"A"的学生,查询结果只显示学生姓名

相关推荐
小Tomkk2 分钟前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
明月醉窗台1 小时前
qt使用笔记二:main.cpp详解
数据库·笔记·qt
沉到海底去吧Go1 小时前
【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
数据库·qt·ocr·图片识别自动改名·图片区域识别改名·pdf识别改名
老纪的技术唠嗑局2 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
未来之窗软件服务2 小时前
JAVASCRIPT 前端数据库-V6--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟·东方仙盟数据库
一只爱撸猫的程序猿4 小时前
构建一个简单的智能文档问答系统实例
数据库·spring boot·aigc
nanzhuhe4 小时前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中4 小时前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog4 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc9214 小时前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab