最近看了一些关于mongodb的教程,感觉很费力,尤其涉及到了一些复杂的操作。比如很多贴上了大段数据来描述样例、或者翻译了大段官方文档的文字,这些都让我感觉疲劳。下面我用自己写的一些话来描述我对mongodb聚合的理解:
注:<>用来标识变量(即里面的内容可以替换成其他),可以按照<>里面的单词的含义来理解下面的代码。
例子:假设你有一组数据,需要按照顺序做这些操作:筛选、分组、求和,你可以用如下代码实现:
db.<collection_name>.aggregate([
{$match:key},
{$group:{_id:$<group_filed_name>, <dispaly_field_name>:{$first:<nonkey_name>}}},
{$group:{_id:null, <sum_name>:{$sum:$<sum_field_name>}}}
]).next().get('<sum_name>')
- <key>表示用来筛选的关键字,它的里面结构形如
{<key1_name>:<key1_value>, <key2_name>:<key2_value>, ...}
- <group_filed_name>表示用来给数据分组的字段名称,其中_id是一个内置的关键字,在_id所在字段的值用来划分分组。
- <display_field_name>表示最后输出的字段的名称,<nonkey_name>表示某个非关键字字段的名称
- 在第二步分组操作做完显示的数据结构是这样的
{_id:<group_field1_value>, <display_field1_name>:<nonkey_field1_name>} {_id:<group_field2_value>, <display_field2_name>:<nonkey_field2_name>} ...
<sum_name>表示最后要显示的求和字段的名称,<sum_field_name>表示要求和的字段的名称,_id:null表示不分组,这里使用$group符号的原因是$sum必须在$group实现
在求和之后数据的结构是这样的
{_id:null,<sum_name>:<sum_value>}
从上面的例子,我们不难看出mongodb的聚合管道操作它允许分组、求和、筛选等等不同的操作依次进行,从代码里面使用了”[]“这个列表操作符,可以想像mongodb的聚合操作就像python的列表一样依次进行读取、操作,而且聚合操作允许重复多次进行的相同的操作。因此,我认为不管多复杂的操作只要分成一些基本操作,都可以用mongodb的聚合操作实现。