MongoDB聚合
MongoDB中聚合(aggregate)主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。MongoDB提供了三种执行聚合的方法:聚合管道、map-reduce函数和单一目的的聚合方法。本文主要介绍聚合管道相关的操作。
管道的概念
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。接下来介绍一下聚合框架中常用的几个操作:
$match:用于过滤数据,只输出符合条件的文档。
用法:{ $match: { } }
$group:通过指定的_id表达式对输入文档进行分组,还可以用于统计结果。每个输出文档的_id字段的值都是唯一的。
用法:
{
$group:
{
_id: , // Group By Expression
: { : },
…
}
}
$project:修改输入文档的字段,可以用来重命名、增加或删除字段。
用法:{ $project: { <specification(s)> } }
$sort:将输入文档排序后输出
用法:{ $sort: { : , : … } }
$limit:用来限制MongoDB聚合管道返回的文档数。
用法:{ $limit: }
举例说明
获取企业小区统计信息:该企业每个小区出售房源和出租房源的个数。
db.team_house_v2.aggregate([
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: …_flag_inner": {
ne: 1},
“teamId”: “5e82e4c62d7f120001e0a570”,
“ownedProperty.unitOwnedForVisitor.state”: 2,//房源状态为在租在售,其他为资料方
}
},
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: … communityId: "commonProperty.unitCommonForVisitor.communityId",
teamId: “$teamId”,
//出售的房源
sellType: {
KaTeX parse error: Expected '}', got 'EOF' at end of input: … if: {
in: ["$ownedProperty.unitOwnedForVisitor.unitType", [0, 2]]},
then: 1,
else: 0,
},
},
//出租的房源
rentType: {
KaTeX parse error: Expected '}', got 'EOF' at end of input: … if: {
in: ["$ownedProperty.unitOwnedForVisitor.unitType", [1, 2]]},
then: 1,
else: 0,
},
},
}
},
{
KaTeX parse error: Expected '}', got 'EOF' at end of input: … communityId: "communityId",
teamId: “$teamId”
},
sellCount: {
s u m : " sum: " sum:"sellType",
},
rentCount: {
s u m : " sum: " sum:"rentType",
}
}
}
]);
分析:
g r o u p 操 作 : 用 于 筛 选 出 该 企 业 所 有 在 租 在 售 的 房 源 信 息 , 然 后 将 符 合 条 件 的 记 录 送 到 下 一 阶 段 group操作:用于筛选出该企业所有在租在售的房源信息,然后将符合条件的记录送到下一阶段 group操作:用于筛选出该企