mongo.Aggregate.倚天剑.剑走偏锋

2020-05-22 00:00:00 文档 表达式 管道 白骨 九阴

热爱武侠的人一定读过金庸老先生写的“倚天屠龙记”,宝刀屠龙,号令天下,莫敢不从,前4篇「Mongo存储和性能优化」所展示的,可以说是屠龙刀,而现在我们即将描述的Aggregate就是倚天剑,倚天不出,谁也争锋..

倚天剑里面所藏武功,就是九阴白骨爪,下面让我们一起来修行这个高深莫测的武功,废话就到此为止,开始练功。

使用聚合框架可以对集合中文档进行变化和组合,可以用多个构件创建一个管道,用于对一连串的文档进行处理,构件有筛选,投影,分组,排序等。

  • 下面介绍管道表达式,管道表达式可以理解为一个KV的结构,其中管道操作符作为“Key”,所对应的“Value”叫做管道表达式。例如{$match:{name:”zhangsan”}},$match称为管道操作符,而{name:”zhangsan”}称之为管道表达式,它称之为管道操作符的操作数(Operand),每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的,例如管道表达式$group: { _id: null, count: { $avg: 1 } } 就包含了一个表达式操作符$avg算平均值。
  • 每个管道表达式只能作用于处理当前正在处理的文档,而不能进行跨文档的操作。管道表达式对文档的处理都是在内存中进行的。除了能够进行累加计算的管道表达式外,其他的表达式都是无状态的,也就是不会保留上下文的信息,累加性质的表达式操作符通常和$group操作符一起使用,来统计该组内大值、小值等。
  • 语法结构: db.collection.aggregate(pipeline,options) , pipeline 「数据的聚合操作」,Options「explain,allowDiskUse,cursor,maxTimeMS,bypassDocumentValidation,readConcern」 具体的详细信息,点击查看官网文
  • 当aggregate返回的结果集(指针或者结果集),当结果集中的单个文档超过16 MB命令会报错;该限制只适用于返回的结果集文档,在管道处理文档的过程中,这个文档很有可能会超过16MB;
  • 如果使用aggregate不指定游标选项或存储集合中的结果,aggregate命令返回一个包涵于结果集的字段中的bson文件。如果结果集的总大小超过bson文件大小限制(16MB)该命令将产生错误;
  • 管道处理阶段有内存限制大不能超过100MB,超过这个限制会报错误;为了能够处理更大的数据集可以开启allowDiskUse选项,可以将管道操作写入临时文件;

下面着重介绍其中的管道操作符号:

  • 九阴白骨爪之$match

简介:通过指定的条件来过滤文档,然后传给下一个管道

语法:{ $match: { <query> } }

 数据源
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b257"), "author" : "ahn", "score" : 60, "views" : 1000 }
{ "_id" : ObjectId("55f5a192d4bede9ac365b258"), "author" : "li", "score" : 55, "views" : 5000 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b259"), "author" : "annT", "score" : 60, "views" : 50 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25a"), "author" : "li", "score" : 94, "views" : 999 }
{ "_id" : ObjectId("55f5a1d3d4bede9ac365b25b"), "author" : "ty", "score" : 95, "views" : 1000 }

查询语句
db.articles.aggregate(
    [ { $match : { author : "dave" } } ]
);

结果
{ "_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", "score" : 80, "views" : 100 }
{ "_id" : ObjectId("512bc962e835e68f199c8687"), "author" : "dave", "score" : 85, "views" : 521 }

相关文章