我正在尝试将查询从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()上实现的任何东西。

08-28 10:07
查看更多