MongoDB查询选择内部选择与分组依据

时间:2015-09-02 06:15:50

标签: mongodb mongodb-query aggregation-framework

在我的旧MYSQL数据库中,我使用以下MYSQL查询。 因为我将我的数据库迁移到mongoDB,所以我必须迁移查询。

在我的旧mysql数据库中,我使用了以下查询

SELECT idValue, 
       Timestamp, 
       Value 
FROM ( 
       SELECT * 
         FROM Metingen2 
        WHERE idGroep = 123 
     ORDER BY idValue ASC , 
              Timestamp DESC 
     ) 
 AS t GROUP BY t.idValue;

有人可以解释我如何在内部选择查询中进行选择吗?

我尝试了以下方法,但没有成功:

$ops = array(
                array(
                    '$match' => array(
                                        'idGroep' => (int)123,
                                     )
                ),
                array(
                    '$sort' => array(
                        "idValue" => 1,
                        "Timestamp"   => -1,
                    )
                ),
                array(
                    '$group' => array(
                        "_id" => array("idValue" => '$idValue',                            
                                      ),
                    ),
                ),
                array(
                    '$project' => array(
                        "_id" => '$_id.idValue',
                        "Timestamp" => '$_id.Timestamp',
                        "Value" => '$value',
                    ),
                ),

            );
            $cursor_metingen2 = $collection_metingen2->aggregate($ops);

1 个答案:

答案 0 :(得分:2)

在传递中看起来查询试图首先对内容进行排序然后" GROUP"一起使用" idValue"然后返回"第一个"在过滤掉" idGroep"之后,在分组边界上的结果当然。

除了" filter"之外,内部选择在这里做的并不多。和"排序"。聚合管道以不同的方式处理这些,因此在该执行中发生的事情并不重要。这完全取决于结果。

因此,您的聚合管道需要做同样的事情:

$cursor =  $collection_metingen2->aggregate(array(
    array(   
        '$match' => array( 'idGroep' => 123 )
    ),
    array(
       '$sort' => array( 
           'idValue' => 1,
           'TimeStamp' => -1
       )
    ),
    array(
        '$group' => array(
           '_id' => '$idValue',
           'TimeStamp' => array( '$first' => '$TimeStamp' ),
           'Value' => array( '$first' => '$value' )
        )
    ),
    array(
        '$sort' => array( '_id' => 1 )
    )
));

请注意,当您$group时,其他字段不仅必须使用"累加器"例如$first(这里应该是正确的)但你也必须"必须"包括你想要输出的所有东西。

它是一个"管道",所以唯一的事情就是"进入"接下来的阶段是" out"你指定的阶段。

当然$sort"两者都是"在分组正确的边界值之前以及在" end"管道。最后一种情况是因为$group不保证任何顺序的密钥,但这可能会或可能不会对从此处处理结果的内容产生任何影响。

另外要注意" cast",除非你真的需要转换为整数类型与数据进行比较(你可能没有),否则你可能会得到不匹配的结果。所以只有"演员"当你知道你需要的时候。