Docs 菜单
Docs 主页
/
Atlas 图表
/ /

后端聚合管道

在此页面上

  • 例子
  • 编码
  • 添加查询
  • 添加计算字段
  • 添加筛选器

为了获取呈现图表所需的数据, Charts创建了MongoDB聚合管道并在MongoDB 数据库服务器上运行该管道。 该管道由多个阶段组成,每个阶段都是根据图表作者指定的不同设置生成的。

本文档解释了如何使用各种图表生成器设置来构建聚合管道。 您可以通过在图表生成器右上角的省略号下拉列表中选择 View Aggregation Pipeline选项来查看用于创建图表的管道。

Atlas Charts构建的管道由按以下顺序排列的以下分段组成:

  1. Charts 视图

  2. 嵌入图表中的预筛选器

  3. 仪表盘过滤器

  4. 图表查询

  5. 查找字段

  6. 计算字段

  7. 嵌入筛选器,包括注入筛选器

  8. 图表筛选器

  9. 编码字段

  10. 排序

  11. 最大文档限制

注意

创建图表时,您可以配置部分图表段,但不是全部。 Charts生成聚合管道时,会跳过未指定的段。

下图显示了一家办公用品公司的总销售额,按购买方式分类。 collection中的每个文档代表一次销售。

以此图表为例,我们将探索上述每个设置的规范如何改变 Atlas Charts 生成的聚合管道。

不带任何筛选器的聚合管道示例。
点击放大

如果没有在Filter窗格中添加任何Data Source管道、 Query条形图查询、计算字段和筛选器,Atlas Charts 会生成以下聚合管道:

1{
2 "$addFields": { // Encoding
3 "__alias_0": {
4 "$sum": "$items.price"
5 }
6 }
7},
8{
9 "$group": {
10 "_id": {
11 "__alias_1": "$purchaseMethod"
12 },
13 "__alias_0": {
14 "$sum": "$__alias_0"
15 }
16 }
17},
18{
19 "$project": {
20 "_id": 0,
21 "__alias_1": "$_id.__alias_1",
22 "__alias_0": 1
23 }
24},
25{
26 "$project": {
27 "x": "$__alias_1",
28 "y": "$__alias_0",
29 "_id": 0
30 }
31},
32
33{
34 "$addFields": { // Sorting
35 "__agg_sum": {
36 "$sum": [
37 "$y"
38 ]
39 }
40 }
41},
42{
43 "$sort": {
44 "__agg_sum": -1
45 }
46},
47{
48 "$project": {
49 "__agg_sum": 0
50 }
51},
52{
53 "$limit": 5000
54}

此时的管道由Encode面板中的群组、默认排序顺序的阶段以及最大文档限制(Atlas Charts 设置为 5000)组成。

以下查询将显示的文档限制为 saleDate等于或晚于January 1, 2017items数组中至少有 5 个元素的文档。 items是一个数组,其中每个元素都是促销期间购买的商品。

query:

{
$and: [
{
saleDate: { $gte: new Date("2017-01-01") }
},
{
'items.4': { $exists: true }
} ]
}

Query栏中应用上述查询会生成以下图表和聚合管道:

带查询的聚合管道示例。
点击放大

聚合管道:

1{
2 "$match": { // Query
3 "$and": [
4 {
5 "saleDate": {
6 "$gte": {
7 "$date": "2017-01-01T00:00:00Z"
8 }
9 }
10 },
11 {
12 "items.4": {
13 "$exists": true
14 }
15 }
16 ]
17 }
18},
19{
20 "$addFields": {
21 "__alias_0": {
22 "$sum": "$items.price"
23 }
24 }
25},
26{
27 "$group": {
28 "_id": {
29 "__alias_1": "$purchaseMethod"
30 },
31 "__alias_0": {
32 "$sum": "$__alias_0"
33 }
34 }
35},
36{
37 "$project": {
38 "_id": 0,
39 "__alias_1": "$_id.__alias_1",
40 "__alias_0": 1
41 }
42},
43{
44 "$project": {
45 "x": "$__alias_1",
46 "y": "$__alias_0",
47 "_id": 0
48 }
49},
50{
51 "$addFields": {
52 "__agg_sum": {
53 "$sum": [
54 "$y"
55 ]
56 }
57 }
58},
59{
60 "$sort": {
61 "__agg_sum": -1
62 }
63},
64{
65 "$project": {
66 "__agg_sum": 0
67 }
68},
69{
70 "$limit": 5000
71}

聚合管道现在从应用的查询开始,然后是在Encode面板中选择的群组和最大文档限制。

我们还可以更改图表以显示按购买方式分类产生的总收入。为了完成此任务,我们将创建一个计算字段,通过将价格乘以数量来计算总收入。除了上面的查询之外,添加这个新的计算字段会生成以下图表和管道:

计算字段表达式:

带有计算字段的聚合管道示例。
点击放大

聚合管道:

1{
2 "$match": {
3 "$and": [
4 {
5 "saleDate": {
6 "$gte": {
7 "$date": "2017-01-01T00:00:00Z"
8 }
9 }
10 },
11 {
12 "items.4": {
13 "$exists": true
14 }
15 }
16 ]
17 }
18},
19{
20 "$addFields": { // Calculated Field
21 "revenue": {
22 "$reduce": {
23 "input": "$items",
24 "initialValue": 0,
25 "in": {
26 "$sum": [
27 "$$value",
28 {
29 "$multiply": [
30 "$$this.price",
31 "$$this.quantity"
32 ]
33 }
34 ]
35 }
36 }
37 }
38 }
39},
40{
41 "$group": {
42 "_id": {
43 "__alias_0": "$purchaseMethod"
44 },
45 "__alias_1": {
46 "$sum": "$revenue"
47 }
48 }
49},
50{
51 "$project": {
52 "_id": 0,
53 "__alias_0": "$_id.__alias_0",
54 "__alias_1": 1
55 }
56},
57{
58 "$project": {
59 "x": "$__alias_0",
60 "y": "$__alias_1",
61 "_id": 0
62 }
63},
64{
65 "$addFields": {
66 "__agg_sum": {
67 "$sum": [
68 "$y"
69 ]
70 }
71 }
72},
73{
74 "$sort": {
75 "__agg_sum": -1
76 }
77},
78{
79 "$project": {
80 "__agg_sum": 0
81 }
82},
83{
84 "$limit": 5000
85}

更新的管道现在包括在Query栏中应用的查询正下方的计算字段,而其余组件的顺序保持不变。

可以通过在Filter窗格中添加筛选器以仅选择在纽约位置进行的店内销售来进一步细化此图表。添加此筛选器会生成以下图表和聚合管道:

带筛选器的聚合管道示例。
点击放大

聚合管道:

1{
2 "$match": {
3 "$and": [
4 {
5 "saleDate": {
6 "$gte": {
7 "$date": "2017-01-01T00:00:00Z"
8 }
9 }
10 },
11 {
12 "items.4": {
13 "$exists": true
14 }
15 }
16 ]
17 }
18},
19{
20 "$addFields": {
21 "revenue": {
22 "$reduce": {
23 "input": "$items",
24 "initialValue": 0,
25 "in": {
26 "$sum": [
27 "$$value",
28 {
29 "$multiply": [
30 "$$this.price",
31 "$$this.quantity"
32 ]
33 }
34 ]
35 }
36 }
37 }
38 }
39},
40{
41 "$match": { // Filter
42 "storeLocation": {
43 "$in": [
44 "New York"
45 ]
46 }
47 }
48},
49{
50 "$group": {
51 "_id": {
52 "__alias_0": "$purchaseMethod"
53 },
54 "__alias_1": {
55 "$sum": "$revenue"
56 }
57 }
58},
59{
60 "$project": {
61 "_id": 0,
62 "__alias_0": "$_id.__alias_0",
63 "__alias_1": 1
64 }
65},
66{
67 "$project": {
68 "x": "$__alias_0",
69 "y": "$__alias_1",
70 "_id": 0
71 }
72},
73{
74 "$addFields": {
75 "__agg_sum": {
76 "$sum": [
77 "$y"
78 ]
79 }
80 }
81},
82{
83 "$sort": {
84 "__agg_sum": -1
85 }
86},
87{
88 "$project": {
89 "__agg_sum": 0
90 }
91},
92{
93 "$limit": 5000
94}

管道现在包括计算字段正下方的storeLocation筛选器,而其余组件的顺序保持不变。

后退

子集模式