Я пытаюсь преобразовать запрос из MySQL в Mongodb
В MySql я использую:
$top_orders = Orders::find(array(
"columns" =>"pro_id",
"group"=>"pro_id",
"having"=>"count(pro_id) > 100",
"order"=>"RAND()",
"limit"=>5
)
);
На самом деле нет прямой связи с этим, но самое близкое, что вы можете получить, это реализовать метод 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
трубопровод требует «ключ», как _id
поэтому, как правило, лучше всего оставить это в покое.
Таким образом, основные шаги, если вы можете жить с этим, являются $group
, $match
, $sort
а также $limit
. Все это этапы конвейерного агрегации, и это общий способ, которым MongoDB делает это как SQL-подобный DSL, плохо переводится на что-либо реализованное на find()
,
Других решений пока нет …