markdown MongoDB的聚合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown MongoDB的聚合相关的知识,希望对你有一定的参考价值。

##管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
  ● $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  ● $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  ● $limit:用来限制MongoDB聚合管道返回的文档数。
  ● $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  ● $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  ● $group:将集合中的文档分组,可用于统计结果。
  ● $sort:将输入文档排序后输出。
  ● $geoNear:输出接近某一地理位置的有序文档。
##$project
$project可以从文档中选择想要的字段,和不想要的字段,也可以通过管道表达式进行一些复杂的操作,例如数学操作,日期操作,字符串操作,逻辑操作。
```
db.artilces.aggregate({"$project":{"author":1,"_id":0}})//表示投射author,忽略_id
db.articles.aggregate({"$project":{"username":"$author"}})//将原来的author修改为username
```
数学表达式:
```
db.employees.aggregate({"$project":{"totalPay":{"$add":["$salary","$bonus"]}}});
```
  ● $add相加
  ● $subtract相减
  ● $multiply相乘
  ● $divide 相除
  ● $mod取模
日期表达式:
```
db.articles.aggregate({"$project":{"year":{"$year":date}}});
```
  ● $year
  ● $month
  ● $week
  ● $dayOfMonth
  ● $dayOfWeek
  ● $dayOfYear
  ● $hour
  ● $minute
  ● $second
字符串表达式:
```
//取作者名字的首字母
db.articles.aggregate({"$project":{"first-word":{"$substr":["$author",0,1]}}})
```
  ● $substr
  ● $concat
  ● $toLower
  ● $toUpper
逻辑表达式:
  ● $cmp
  ● $strcasecmp
  ● $and
  ● $not
  ● $cond
  ● $ifNull
  ● $not
  ● $eq
  ● $gt
  ● $lt
  ● $gte
  ● $lte

##$match
相当于其他查询中的条件,也就是$query,查询名字为joy
```
db.mycol.aggregate({$match:{name : "joy"}})
```
##$limit,$skip,$sort
这些条件和普通的查询一样,如
```
db.mycol.aggregate({$match:{name : "joy"},$limit:10,$skip:0,$sort:{score : 1}})
```
##$unwind
数据
```
{
  "author":"k",
  "post":"Hello,world",
  "comments":[ 
        { "author":"mark", "date":new Date(), "text":"Nice Post." },
        {"author":"bill", "date":new Date(), "text":"I agree" } 
  ] 
}
```
拆分comments数组
`db.blog.aggregate({"$unwind":"$comments"})`
结果
```
{ 
  "_id" : ObjectId("570dec60a55dd9f86ffcb531"), 
  "author" : "k", 
  "post" : "Hello, world", 
  "comments" : { "author" : "mark", "date" : ISODate("2016-04-13T06:51:12.296Z"), "text" : "Nice Post." } 
}
{ 
  "_id" : ObjectId("570dec60a55dd9f86ffcb531"), 
  "author" : "k", 
  "post" : "Hello,world", 
  "comments" : { "author" : "bill", "date" : ISODate("2016-04-13T06:51:12.296Z"),"text" : "I agree" } 
}
```
##$group
$group操作可以将文档一句特定字段的不同值进行分组。如果选定了需要分组的字段就可以将选定的字段传递给"$group"函数的"_id"字段。例如:`{"$group":{"_id":"$author"}}`。如果只执行分组的话那么返回的结果就只有这一个字段,我们可以结合分组操作符来对每个分组进行一些计算。
  ● $sum  求和
  ● $avg  平均值
  ● $min 最小值
  ● $max 最大值
  ● $push  插入到数组
  ● $addToSet 插入到数组,但是不插入重复的值
  ● $first  第一个文档数据
  ● $last  最后一个文档数据

以上是关于markdown MongoDB的聚合的主要内容,如果未能解决你的问题,请参考以下文章

mongodb3 之单一用途聚合

Mongodb中数据聚合之聚合管道aggregate

MongoDB 聚合

翻译MongoDB指南/聚合——聚合管道

mongodb Aggregation聚合操作之$bucket

Mongodb中数据聚合之基本聚合函数countdistinctgroup