往期文章:
【NoSQL数据库】MongoDB数据库的安装与卸载-CSDN博客
【NoSQL数据库】MongoDB数据库——集合和文档的基本操作(创建、删除、更新、查询)-CSDN博客
目录
一、MongoDB文档查询原理
1、使用 find() 方法进行文档基本查询
2、文档查询条件的使用
3、特定类型查询
4、聚合查询
二、 MongoDB文档查询操作
1、创建集合
2、插入文档数据
3、查询文档数据
4、统计文档数据
5、简单条件查询
6、多条件查询
7、or条件查询
8、AND 和 OR 联合查询
9、使用聚合aggregate进行查询
10、管道使用
三、学习笔记
一、MongoDB文档查询原理
1、使用 find() 方法进行文档基本查询
语法格式如下:db.collection.find(query,projection)
参数说明:
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
2、文档查询条件的使用
操作 | 格式 | 范例 | RDBMS中的类似语句 |
等于 | {<key>:<value>} | db.col.find({"by":"x"}).pretty() | where by = 'x' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
3、特定类型查询
针对特定类型的文档进行查询,如查询键为NULL的空文档
4、聚合查询
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。db.collection.aggregate()是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
表达式 | 描述 | 实例 |
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
二、 MongoDB文档查询操作
1、创建集合
使用test数据库,并创建items集合,mongodb语句如下所示:
Use test
Db.creatCollection("items")
2、插入文档数据
一共有八个订单的商品信息,如下所示:
db.items.insert([
{"quantity":2,price:5.0,pnumber:"p003"},
{"quantity":2,price:8.0,pnumber:"p002"},
{"quantity":1,price:4.0,pnumber:"p002"},
{"quantity":2,price:4.0,pnumber:"p001"},
{"quantity":4,price:10.0,pnumber:"p003"},
{"quantity":10,price:20.0,pnumber:"p001"},
{"quantity":10,price:20.0,pnumber:"p003"},
{"quantity":5,price:10.0,pnumber:"p002"}
])
3、查询文档数据
查询刚才插入的数据,查询语句如下所示,其中pretty()可以格式化显示查询结果:
db.items.find().pretty()
4、统计文档数据
统计items的文档数据,使用如下语句:
db.items.count()
5、简单条件查询
查询价格大于5的商品数据,如下所示:
db.items.find({price:{$gt:5}})
6、多条件查询
查询quantity为10且价格大于等于5的商品数据,查询语句如下所示:
db.items.find({quantity:10,price:{$gte:5}})
7、or条件查询
查询quantity为10或价格大于等于5的商品数据,查询语句如下所示,比起上一题的多条件查询有结构上的区别:
db.items.find({$or:[{quantity:10},{price:{$gte:5}}]})
8、AND 和 OR 联合查询
查询pnumber为“p003”且quantity为10或价格大于等于5的商品数据,如下所示:
db.items.find({pnumber:"p003",$or:[{quantity:10},{price:{$gte:5}}]})
9、使用聚合aggregate进行查询
(1)统计订单中所有商品的数量,即统计quantity的总和,使用$group和$sum,如下所示:
db.items.aggregate([{$group:{_id:null,total:{$sum:"$quantity"}}}])
(2)通过产品类型来进行分组,然后在统计卖出的数量,如下所示:
db.items.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}}])
(3)通过相同的产品类型来进行分组,然后查询相同产品类型卖出最多的订单详情,如下所示:
db.items.aggregate([{$group:{_id:"$pnumber",max:{$max:"$quantity"}}}])
(4)通过相同的产品类型来进行分组,然后查询每个订单详情相同产品类型卖出的平均价格,这里用到$avg如下所示:
db.items.aggregate([{$group:{_id:"$pnumber",price:{$avg:"$price"}}}])
10、管道使用
通过相同的产品类型来进行分组,统计各个产品数量,然后获取最大的数量。这里用到两个$group,第一个是筛选相同的产品类型并统计产品数量,第二个是找到最大的产品数量,如下所示:
db.items.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}},{$group:{_id:null,max:{$max:"$total"}}}])
三、学习笔记
MongoDB数据库的文档查询操作涉及到文档查询需要用到的一些查询表达式,比如$sum用于计算总和、$avg用于计算平均值,$max和$min分别用于获取最大值和最小值,还有关于比较的表达式,如$lt代表小于,$lte代表小于等于,$gt代表大于,$gte代表大于等于,$ne代表不等于,以及查询条件表达式,比如$or。
db.collection.find()用于普通查询,聚合查询使用db.collection.aggregate(),$group拿来按照特定条件分组查询统计。