在我的旧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);
答案 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",除非你真的需要转换为整数类型与数据进行比较(你可能没有),否则你可能会得到不匹配的结果。所以只有"演员"当你知道你需要的时候。