MongDB基础学习(五)——投影,分页,排序,聚合

MongDB基础学习(五)——投影,分页,排序,聚合

基础语法的学习

马上就要过年啦,明天也是情人,后天就要放假啦,希望自己能够在放假前把五和六的章节写完。很高兴的一点,昨天看到我写的“【MongoDB for Java】Java操作MongoDB”能够被放到CSDN博客的首页的头条,本章节的学习内容如下:

(1)    MongoDB的投影的语法和示例学习

(2)    MongoDB的Limit()和Skip()方法学习,从而达到分页的效果

(3)    MongoDB的sort() 方法学习

(4)    MongoDB的聚合方法学习,主要用于返回数据记录和计算结果

5.1 MongoDB的投影

mongodb 投影意思是只查询必要的数据而不是查询一个文件的全部数据。如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段。

(1)    find() 方法

MongoDB 的find()方法,在MongoDB查询文档解释接受第二个可选参数是要检索的字段列表。在MongoDB中,当执行find()方法,那么它会显示一个文档所有字段。要限制这一点,需要设置的字段列表值1或0。 1用来显示字段而0是用来隐藏字段。

(2)    语法

find()方法具有投影基本语法如下:db.COLLECTION_NAME.find({},{KEY:1})

(3)    示例

> db.web_app.find()

{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追梦客", "oldName" :"好童话", "description" : "这是一个VR旅游电子商务网站" }

{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }

> db.web_app.find({},{"_id":0,"name":1})

{ "name" : "追梦客" }

{ "name" : "好童话" }

{ }

可以看到,这里只显示我们需要查询的字段。这个在开发API接口的经常会用到,我们只想外面暴露部分数据,可以加强数据安全性。

5.2 MongoDB的分页

MongoDB的分页主要用到Limit()和Skip()方法,它们基本的操作如下:

(1)    Limit() 方法

要限制 MongoDB 中的记录,需要使用 limit() 方法。 limit() 方法接受一个数字型的参数,这是要显示的文档数(这个Mysql的limit的是有区别的,大家学习的时候,可以进行比较学习,想一下mysql或者其他数据库操作,MongoDB里是怎么完成,自我感觉这样加深学习)。

(2)    语法:

limit() 方法的基本语法如下:db.COLLECTION_NAME.find().limit(NUMBER)

(3)    示例

>db.web_app.find()

{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追梦客", "oldName" :"好童话", "description" : "这是一个VR旅游电子商务网站" }

{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"),"city" : "西安", "address" : "www.dreamerkr.com.cn" }

> db.web_app.find().limit(2)

{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追梦客", "oldName" :"好童话", "description" : "这是一个VR旅游电子商务网站" }

{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

(4)    Skip()方法

方法skip() 也接受数字类型的参数,并使用跳过的文档数。例如skip(5),意思就是跳过前五条数据,显示后面的数据。请注意,默认值skip()方法是0,也就是说我们可以调用skip不传参数,MongoDB会给一个默认参数0.

5)    语法

skip()方法基本语法如下: db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

(6)    示例

> db.web_app.find()

{ "_id" :ObjectId("54d877e4ebde50baebb6c4c8"), "name" : "追梦客", "oldName" :"好童话", "description" : "这是一个VR旅游电子商务网站" }

{ "_id" :ObjectId("54d87cdfebde50baebb6c4c9"), "name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }

> db.web_app.find().limit(2).skip(2)

{ "_id" :ObjectId("54d87cdfebde50baebb6c4ca"), "city" : "西安", "address" :"www.dreamerkr.com.cn" }

这里就是MongoDB的分页操作,页面显示两条数据,就像mysql的{begNum}, {endNum},这里换成啦db.web_app.find().limit(endNum-begNum).skip(begNum)意思就从第几行开始读取N记录。

5.3 MongoDB的排序

(1) sort() 方法

要在 MongoDB 中的文档进行排序,需要使用sort()方法。 sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序。要指定排序顺序1和-1。 1用于升序排列,而-1用于降序。

(2) 语法

sort() 方法的基本语法如下:db.COLLECTION_NAME.find().sort({KEY:1})

(3)    示例

如果不指定排序优先,然后sort() 方法将文档显示在升序排列

> db.web_app.find()

{ "_id" : ObjectId("54d877e4ebde50baebb6c4c8"),"name" : "追梦客", "oldName" : "好童话","description" : "这是一个VR旅游电子商务网站" }

{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"),"city" : "西安", "address" : "www.dreamerkr.com.cn" }

> db.web_app.find().sort({"name":1})

{ "_id" : ObjectId("54d87cdfebde50baebb6c4ca"), "city": "西安","address" : "www.dreamerkr.com.cn" }

{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童话", "des" : "这是一个o2o的vr旅游平台" }

{ "_id" : ObjectId("54d877e4ebde50baebb6c4c8"),"name" : "追梦客", "oldName" : "好童话","description" : "这是一个VR旅游电子商务网

5.4 MongoDB的聚合

聚合操作过程中的数据记录和计算结果返回。聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果。在SQL COUNT(*)和groupby 相当于MongoDB的聚集。

(1)    aggregate() 方法

对于在MongoDB中聚集,应该使用aggregate()方法。

(2)    语法

aggregate()方法的基本语法如下:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

(3)    示例

> db.web_info.find()

{ "_id" : ObjectId("54d87cdfebde50baebb6c4c9"),"name" : "好童话", "address" : "这是一个o2o的vr旅游平台" }

{ "_id" :ObjectId("54db2e0fc50ae3624c1a555c"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" :ObjectId("54db2e2ac50a6a0d0c6a8c98"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" :ObjectId("54db2e36c50a607e6eb3d548"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" :ObjectId("54db2e6bc50a5f841ad5c196"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" : ObjectId("54db2e6bc50a5f841ad5c197"),"name" : "tom" }

{ "_id" :ObjectId("54db2ebdc50a86203da25e72"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" :ObjectId("54db2ebdc50a86203da25e73"), "name" : "雨打排行" }

{ "_id" :ObjectId("54db2ef5c50a536eb77a3d6d"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" :ObjectId("54db2ef5c50a536eb77a3d6e"), "name" : "雨打排行" }

{ "_id" :ObjectId("54dc0687c50acb624c30dfcb"), "name" : "追梦客", "address" :"http://www.dreamerkr.com" }

{ "_id" : ObjectId("54dc0808c50a5945720b1723"),"name" : "追梦客", "address" : "http://www.dreamerkr.com" }

{ "_id" :ObjectId("54dc0808c50a5945720b1724"), "name" : "雨打排行2" }

{ "_id" :ObjectId("54dc09adc50ac37356e0f1a9"), "name" : "追梦客" }

{ "_id" :ObjectId("54dc0a4ac50a4fac80213257"), "name" : "追梦客" }

{ "_id" :ObjectId("54dc0a8cc50ad7af35250807"), "name" : "追梦客2" }

{ "_id" :ObjectId("54dc0ac4c50adf3258a884bf"), "name" : "追梦客2" }

{ "_id" :ObjectId("54dc0baec50ad2416bac179b"), "name" : "追梦客" }

{ "_id" :ObjectId("54dc0cc3c50afa2987800afe"), "name" : "追梦客" }

{"_id" : ObjectId("54dc130fc50a1c2e75e2b05c"),"name" : "追梦客", "address" : "http://www.dreamerkr.com" }

> db.web_info.aggregate([{$group: {_id : "$name", num : {$sum : 1}}}])

{ "_id" : null,"num" : 2 }

{ "_id" : "雨打排行2", "num" : 1 }

{ "_id" : "雨打排行", "num" : 3 }

{ "_id" :"tom", "num" : 1 }

{ "_id" : "追梦客", "num" : 13 }

{ "_id" : "追梦客2", "num" : 2 }

{ "_id" : "好童话", "num" : 3 }

上述使用的情况相当于SQL查询 select name, count(*) from web_info group by name。在上面的例子中,我们已分组字段name 文档,并在每个的次数name先前的值总和递增。其他聚集表达式列表如下:


表达式


描述


实例


$sum


总结从集合中的所有文件所定义的值.


db.web_info.aggregate([{$group : {_id : "$name", num : {$sum : "$address"}}}])


$avg


从所有文档集合中所有给定值计算的平均.


db.web_info.aggregate([{$group : {_id : "$name", num : {$avg : "$address"}}}])


$min


获取集合中的所有文件中的相应值最小.


db.web_info.aggregate([{$group : {_id : "$name", num : {$min : "$address"}}}])


$max


获取集合中的所有文件中的相应值的最大.


db.web_info.aggregate([{$group : {_id : "$name", num : {$max : "$address"}}}])


$push


值插入到一个数组生成文档中.


db.web_info.aggregate([{$group : {_id : "$name", address : {$push: "$address"}}}])


$addToSet


值插入到一个数组中所得到的文档,但不会创建重复.


db.web_info.aggregate([{$group : {_id : "$name", address : {$addToSet : "$address"}}}])


$first


根据分组从源文档中获取的第一个文档。通常情况下,这才有意义,连同以前的一些应用 “$sort”-stage.


db.web_info.aggregate([{$group : {_id : "$name", first_address : {$first : "$address"}}}])


$last


根据分组从源文档中获取最后的文档。通常,这才有意义,连同以前的一些应用 “$sort”-stage.


db.web_info.aggregate([{$group : {_id : "$name", last_address : {$last : "$address"}}}])

时间: 2024-08-29 02:56:33

MongDB基础学习(五)——投影,分页,排序,聚合的相关文章

Python基础学习五

Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出键值对. for key in dict: #迭代键 for val in dict.value(): #迭代值 for k,v in dict.items(): #迭代键值对 当迭代列表时,通过内置函数enumerate()可以迭代出索引加值. for i in list #迭代列表 for i

bootstrap基础学习五篇

bootstrap表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. <thead> 表格标题行的容器元素(<tr>),用来标识表格列. <tbody> 表格主体中的表格行的容器元素(<tr>). <tr> 一组出现在单行上的表格单元格的容器元素(<td> 或 <th>). <td> 默认的

MongDB基础学习(七)—— 【MongoDB for Java】Java操作MongoDB

[MongoDB for Java]Java操作MongoDB 开发的产品为了融资,不停得改版,从第一版到现在最新版本,最后发现公司发展方向都变了,有最初电子商务改成VR内容提供者(没办法,要别人钱,就得按照别人的规划的战略走).本来本章节会放到后面再做讲解,无奈,部门需要做一次培训任务,我就想到拿Java操作MongoDB作为培训内容,开发环境和依赖jar如下: (1)开发环境: System:Windows IDE:eclipse Database:mongoDB2.6 Maven:apac

tensorflow 基础学习五:MNIST手写数字识别

MNIST数据集介绍: from tensorflow.examples.tutorials.mnist import input_data # 载入MNIST数据集,如果指定地址下没有已经下载好的数据,tensorflow会自动下载数据 mnist=input_data.read_data_sets('.',one_hot=True) # 打印 Training data size:55000. print("Training data size: {}".format(mnist.

Redis基础学习(五)&mdash;Redis的主从复制

一.概述     Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中.让从服务器(slave server)成为主服务器(master server)的精确复制品. 以下是关于 Redis 复制功能的几个重要方面: (1)Redis 使用异步复制.从Redis 2.8 开始,从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度. (

Shell基础学习(五) test命令

1.数值测试 参数 说明 -eq 等于则为真 -gt 大于则为真 -lt 小于则为真 -nq 不等于则为真 -ge 大于等于为真 -le 小于等于为真 示例: num1=100 num2=100 if test $[num1] eq $[num2] then echo '二个数相等' else echo '二个数不相等' fi 输出:二个数相等 2.字符串测试 参数 说明 = 等于则为真 != 不等于为真 -z 字符串长度为零为真 -n 字符串长度不为零位真 示例: string1='liupf

Struts2基础学习(五)&mdash;拦截器

一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多个Interceptor 连在一起组成Interceptor 栈.     Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题.      注意:              (1

JavaScript基础学习(五)&mdash;其他引用类型

     JavaScript定义了两个内置对象: Global和Math. 一.Global对象 1.URI编码方法      Global对象的encodeURI()和encodeURIComponent()方法可以对URI进行编码,以便发送给浏览器.有效的URI不能包含某些字符,例如空格,这个两个URI编码方法可以对URI进行编码,用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解.      这两个方法的主要区别是: encodeURI()不会对本书属于URI的特殊字符

Spring基础学习(五)&mdash;事务管理

一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视为错误,所有从起始点以后的操作应全部回退到开始状态.      事务的操作: 先定义开始一个事务,然后对数据做修改操作,这时如果提交(commit),这些数据就永久的保存下来,如果回退(rollback),数据库管理系统就放弃所有的修改而回到开始事务的状态.   2.事务的属性 (1)原子性(Atm