05-使用聚合框架运算符
9.2.2 使用聚合框架运算符
MongoDB提供的聚合框架功能极其强大,让您能够反复将一个聚合运算符的结果传递给另一个运算符。为演示这一点,假设有下面的数据集:
{o_id:"A", value:50, type:"X"}
{o_id:"A", value:75, type:"X"}
{o_id:"B", value:80, type:"X"}
{o_id:"C", value:45, type:"Y"}
下面的一系列聚合运算符将$match的结果交给运算符$group,再将分组集作为参数results传递给回调函数。注意到引用文档的字段值时,在字段名前加上了美元符号,如$o_id和$value。这种语法让聚合框架将其视为字段值而不是字符串。
aggregate( { $match:{type:"X"}},
{ $group:{set_id:"$o_id", total: {$sum: "$value"}}},
function(err, results){});
运算符$match执行完毕后,将交给$group进行处理的文档如下:
{o_id:"A", value:50, type:"X"}
{o_id:"A", value:75, type:"X"}
{o_id:"B", value:80, type:"X"}
运算符$group执行完毕后,将把一个对象数组传递给回调函数,该数组中的对象包含字段set_id和total:
{set_id:"A", total:"125"}
{set_id:"B", total:"80"}
表9.1列出了可在方法aggregate()的operator参数中指定的命令。
| 运算符 | 描述 |
| :----- | :----- | :----- | :----- |
| $project | 通过重命名、添加或删除字段来重新定义文档。您还可以重新计算值以及添加子文档。例如,下面的示例包含字段title并排除字段name:{$project:{title:1, name:0}};下面的示例将字段name重命名为title:{$project:{title:"$name"}};下面的示例添加新字段total并根据字段price和tax计算其值:{$project:{total:{$add:["$price", "$tax"] } } |
| $match | 使用本书前面讨论的查询运算符过滤文档集,如{$match:{value:{$gt:50}}} |
| $limit | 限制传递给聚合流水线中下一个阶段的文档数,如{$limit:5} |
| $skip | 指定执行聚合流水线的下一个阶段前跳过多少个文档,如{$skip:10} |
| $unwind | $unwind的值必须是数组字段的名称(必须在该数组字段名前加上$,这样它才会被视为字段名,而不是字符串)。$unwind对指定的数组进行分拆,为其中的每个值创建一个文档,如{$unwind:"$myArr"} |
| $group | 将文档分组并生成一组新文档,供流水线的下一个阶段使用。在$group中必须定义新文档的字段;还可对各组的文档应用分组表达式运算符,如将value字段的值相加:{$group:{set_id:"$o_id", total: {$sum: "$value"}}} |
| $sort | 将文档交给聚合流水线的下一个阶段前,对它们进行排序。$sort指定包含属性field: