mongodb分组求和 保留两位小数 mongodb分组后排序_mongodb

最近在获取MongoDB数据时需要把重复的数据分组来排序,语言版本:PHP7

直接上代码

$param = [    'aggregate' => '表名',    'pipeline'  => [        // 搜索条件        ['$match' => ['status' => 1]],        // 根据重复的title来group分组 max_sort=>获取最大的排序值        ['$group' => ['_id' => '$title', 'count' => ['$sum' => 1], 'max_sort' => ['$max' => '$sort']]],        // 根据分组的最大值条件降序        ['$sort' => ['max_sort' => -1]]    ],    // 高版本需要带上这个值    'cursor'    => new stdClass()];$mongodb = new MaMongoDBDriverManagerager('mongodb://localhost:27017/', []);$command = new MongoDBDriverCommand($param);$result  = $mongodb->executeCommand('数据库', $command);$res   = $result->toArray();

一切都是按照预想的结果,但是出来的结果太多了,实际项目中大多数需要分页效果,这时候加上skip,limit条件进去

'pipeline'  => [        // 搜索条件        ['$match' => ['status' => 1]],        // 根据重复的title来group分组 max_sort=>获取最大的排序值        ['$group' => ['_id' => '$title', 'count' => ['$sum' => 1], 'max_sort' => ['$max' => '$sort']]],        ['$skip'  => ($page - 1) * $limit],        ['$limit' => (int)$limit,        // 根据分组的最大值条件降序        ['$sort'  => ['max_sort' => -1]]    ],

跑下代码之后发现出来的结果倒是问题,但是排序混乱了。。。

why?在没有解决这个问题之前,可谓是翻遍了Google、Baidu等所有能查的资源网站,都无从解决下手。最后无奈,只能顶着网速和过了18级的英语水平去看官网的文档了。

在MongoDB游标方法中,例如限额,排序,跳过可以以任何顺序应用=>顺序无关紧要。 find()返回一个游标,在其上应用了修改。排序总是在限制之前完成,跳过也要在限制之前完成。因此换句话说,顺序是:排序->跳过->限制

聚合框架不会返回数据库游标。而是返回带有汇总结果的 document 。它的工作原理是在管道的每个步骤中产生中间结果,因此操作的顺序确实很重要。

重点来了,聚合查询不会返回数据游标,所以排序很重要。按照MongoDB官方的推荐写法

db.test.find().sort({"age":1}).limit(2);

也就是说正常的顺序是sort->skip->limit,这时候把上面的语句换下顺序后

'pipeline'  => [        // 搜索条件        ['$match' => ['status' => 1]],        // 根据重复的title来group分组 max_sort=>获取最大的排序值        ['$group' => ['_id' => '$title', 'count' => ['$sum' => 1], 'max_sort' => ['$max' => '$sort']]],        // 根据分组的最大值条件降序        ['$sort'  => ['max_sort' => -1]],        ['$skip'  => ($page - 1) * $limit],        ['$limit' => (int)$limit,    ],

再跑下代码,分组分页正常,排序也是按照sort里面的条件排了。可能很多小伙伴遵循了sort->skip->limit这种顺序的写法没有出现过异常,但是对于平时不是那么严谨的小伙伴来说,比如我,可能就会在这种问题上卡很久,谁会想到一个数组的排序会多数据结果产生那么大的影响。