我正在尝试将查询从mysql转换为mongodb
在mysql中,我使用:
$top_orders = Orders::find(array(
"columns" =>"pro_id",
"group"=>"pro_id",
"having"=>"count(pro_id) > 100",
"order"=>"RAND()",
"limit"=>5
)
);
最佳答案
实际上与此没有直接关系,但最接近的方法是从Collection中实现aggregate()方法。
$top_orders = Orders::aggregate(array(
array( '$group' => array(
'_id' => '$pro_id',
'count' => array( '$sum' => 1 )
)),
array( '$match' => array(
'count' => array( '$gt' => 100 )
)),
array( '$sort' => array( 'count' => -1 ) ),
array( '$limit' => 5 )
));
如您所见,缺少的部分是
RAND()
函数,其中mongodb聚合查询中没有直接的替代函数来在聚合管道中生成这样的随机数。不过,您可以按照我在这里为示例所做的操作,并根据您提供的内容进行排序,例如tge“count”total。如果您认为输出需要特定的名称,也可以使用
$project
来更改字段。$group
管道需要一个“key”a s_id
,因此通常最好的性能考虑是不要管它。因此,如果你能接受它,最基本的步骤是
$group
,$match
,$sort
和$limit
。这些都是聚合管道阶段,这是mongodb作为类似sql的dsl的一般方式,不能很好地转换为find()
上实现的任何东西。