2015-09-02 54 views
0

在我以前的MYSQL数据库中,我使用以下MYSQL查询。 因为我将数据库迁移到mongoDB,所以我必须迁移查询。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); 
+3

那么你的数据不再在MySQL中,它在MongoDB中。因此,请显示数据的外观以及您希望从数据中获得的结果。 SQL已经没有关系了,而且总是作为对问题的一个糟糕的解释。正如它在这里没有解释这个问题一样。 –

+0

对不起,我重写了这个问题。 –

+0

在这里看不到任何重写,但SQL翻译应该足够简单。你真的不应该问“如何重写这个SQL”,而是显示数据和预期的结果。这是一个更广泛的受众更清晰的问题。放入SQL仅供参考。 –

回答

2

在一通,它看起来像查询试图一阶一起使用“idValue”和内容,然后“GROUP”当然,在过滤出“idGroep”后,返回分组边界上的“第一个”结果。

除了“筛选”和“排序”之外,内部select在这里并没有太多的工作。聚合管道以不同方式处理这些问题,所以执行中发生的事情没有多大意义。这完全是关于结果。

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

$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(这应该是正确的),但你也“必须”包括你想要输出的所有东西。

这是一个“管道”,所以进入下一个阶段的唯一的东西就是什么出现在你指定的阶段。

当然还有$sort“both”在对正确的边界值进行分组之前以及在管道的“末端”。最后一种情况是因为$group不以任何顺序保证密钥,但这对于处理来自这里的结果的处理可能会或可能不会产生任何结果。

还要小心“铸造”,因为除非你真的需要转换为整数类型与数据进行比较(并且你可能不需要),那么你可能会得到不匹配的结果。所以只有当你知道你需要时才会“投”。