首页 > 解决方案 > 如何返回包含最大值的列

问题描述

我有一个我试图纠正的聚合。我将数据分组在一起,并希望返回具有最高PID. 我可以使用 max,它返回最高的 PID,但不返回相应的VALUE.

这些是我管道中的阶段。

[
          '$project'=> [
            "RS_VERSION" => 1,
            "TRADE_DATE" => 1,
            "JURISDICTION" => 1,
            "DELIVERY_DATE" => 1,
            "DELIVERY_HOUR" => ['$convert'=> [ 'input'=> '$DELIVERY_HOUR', 'to'=> 'int']],
            "DELIVERY_INTERVAL" => ['$convert'=> [ 'input'=> '$DELIVERY_INTERVAL', 'to'=> 'int']],
            "DELIVERY_TIME" => 1,
            "VALUE" => 1,
            "DELIVERY_ORDER" => 1,
            "PID" => ['$convert'=> [ 'input'=> '$PID', 'to'=> 'int']],
            "KEY"=> [ 
              '$concat'=> [
                '_', '$RS_VERSION', '_', '$TRADE_DATE', '_', '$JURISDICTION', '_', '$DELIVERY_DATE', '_', '$DELIVERY_HOUR', '_', '$DELIVERY_INTERVAL' ,'_', '$DELIVERY_TIME', '_', '$DELIVERY_ORDER'
              ]
            ],
          ]
        ],
        [
          '$group'=> [
            '_id'=> '$KEY',
            'RS_VERSION'=>['$first'=> '$RS_VERSION'],
            'TRADE_DATE'=>['$first'=> '$TRADE_DATE'],
            'JURISDICTION'=>['$first'=> '$JURISDICTION'],
            'DELIVERY_DATE'=>['$first'=> '$DELIVERY_DATE'],
            'DELIVERY_HOUR' =>['$first'=> '$DELIVERY_HOUR'],
            'DELIVERY_INTERVAL' =>['$first'=> '$DELIVERY_INTERVAL'],
            'DELIVERY_TIME'=>['$first'=> '$DELIVERY_TIME'],
            'DELIVERY_ORDER'=>['$first'=> '$DELIVERY_ORDER'],
            'pid' => ['$first'=> '$PID'],
            'VALUE' => ['$first' => '$VALUE']
          ]
        ],

我需要根据分组从最高 pid 返回相应的文档值。目前我并不总是得到相应的价值。

标签: phpmongodb

解决方案


看起来 $group 只是为每个不同的值获取第一个文档$KEY,如果这是意图,在分组之前按 pid 排序,那么您可以为每个键获取第一个文档。

{$sort: { PID: -1 }},

然后小组阶段将选择与每个键对应的第一个值,并且由于文档按 pid 降序排列,因此这些字段都将对应于该键的最高 pid。


推荐阅读