在MongoDB集合中查找文档
- 一、实验目的
- 二、实验原理
- 三、实验步骤
-
- [1.启动MongoDB数据库、启动MongoDB Shell客户端](#1.启动MongoDB数据库、启动MongoDB Shell客户端)
- 2.数据准备-->person.json
- 3.指定返回的键
- [4 .包含或不包含 i n 或 in 或 in或nin、elemMatch(匹配数组)](#4 .包含或不包含 i n 或 in 或 in或nin、elemMatch(匹配数组))
- [5.OR 查询 $or](#5.OR 查询 $or)
- [6.Null、exists](#6.Null、exists)
- [7.正则查询 $regex](#7.正则查询 $regex)
- [8.not 的使用](#8.not 的使用)
- [9.数组查询all 和 index 应用](#9.数组查询all 和 index 应用)
- [10.查询指定长度数组size,它不能与比较查询符一起使用](#10.查询指定长度数组size,它不能与比较查询符一起使用)
- [11.查询出喜欢的书籍数量大于 4 本的学生](#11.查询出喜欢的书籍数量大于 4 本的学生)
- 12.利用shell查询出Jim喜欢看的书的数量
- [13.在当前数据库 persons1 集合中中添加以下文档信息:](#13.在当前数据库 persons1 集合中中添加以下文档信息:)
- [14.slice 操作符返回文档中指定数组的内部值](#14.slice 操作符返回文档中指定数组的内部值)
- 15.嵌套文档查询
- 16.分页和排序
- 17.游标
- 18.Count函数------计数
- 19.Distinct函数------去重
- 20.嵌套文档查询
一、实验目的
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把中国国籍的学生上增加新的键 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增加字段 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"的学生,查询结果只显示学生姓名
