当前位置:嗨网首页>书籍在线阅读

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参数中指定的命令。

表9.1  可在方法aggregate()中使用的聚合运算符

| 运算符 | 描述 | | :----- | :----- | :----- | :----- | | $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:的对象,其中为1(升序)或-1(降序),如{$sort: {name:1, age:-1}} |