Mongo сортировать после предела после сортировки - Не работает

У меня есть коллекция, из которой я получаю определенный тип пользователей, используя $query Затем мне нужно отсортировать их в соответствии с user_id по возрастанию и ограничить их до 2000

Из них мне нужен max user_id, поэтому я сортирую их в порядке убывания и ограничиваю 1.

Но этот второй сортировка забывает предел 2000 и сортирует по всему курсору из find().

Любая работа вокруг?

$cursor = $collection ->find($query) // too many entries
 ->sort(array('user_id'=>1)) // go ascending
 ->limit(2000) // got our limited qouta
 ->sort(array('user_id'=>-1)) // go descending to get max
 ->limit(1); // the one with max(user_id)
5 ответов

Ваш не может сделать вид, а затем лимит, а затем - сортировку. Объект Cursor точно такой, и он не будет запускать запрос до тех пор, пока вы не перейдете к первому результату через getNext(), который запускается вручную или внутри цикла foreach не только, но sort является просто свойством объекта поскольку такие два типа просто перезаписывают свойство.

Лучший способ добиться того, что вы ищете:

$doc = $collection->find($query)->sort(array('user_id' => 1))
 ->skip(1999)->limit(1)->getNext();

Это всегда будет выбирать наивысший user_id (который встречается в конце этого типа) группы, что даст те же результаты, что и два вида.


Как насчет использования skip():

$cursor = $collection ->find($query) 
 ->sort(array('user_id'=>1)) 
 ->limit(2000) 
 ->skip(1999);


Ответа на этот вопрос Sammaye.

Вы все равно можете достичь того, чего хотите. Вы можете использовать структуру агрегации, поскольку она выполняет один этап после другого этапа и т.д.

$doc = $collection->aggregate(array(
 array(
 '$match' => $query,
 ),
 array(
 '$sort' => array(
 'user_id'=> 1
 ),
 ),
 array(
 '$limit' => 2000
 ),
 array(
 '$sort' => array(
 'user_id'=> -1
 ),
 ),
 array(
 '$limit' => 1
 ),
));


Я использую следующий код в php5 и mongodb последняя сборка:

$doc = $collection->find($query)->sort(array('user_id' => 1))
 ->skip(1999)->limit(1)->getNext();

Он перестает работать, когда я использую ->skip(1999)->limit(1) после sort()

Курсор $doc дает мне значения. Я попытался сделать это:

$doc = $collection->find($query)->sort(array('user_id' => 1))
$doc = $doc->skip(1999)->limit(1);

Это сработало. Может быть, вы должны попробовать это в новых версиях.


В чем причина подхода к методу сортировки-лимита-сортировки?

Не можете ли вы просто сделать

$cursor = $collection ->find($query)
 ->sort(array('user_id'=>-1))
 ->limit(1);

EDIT: Также действует только последний sort, примененный к курсору. (Эта строка присутствует в pymongo docs здесь, что имеет смысл.)

licensed under cc by-sa 3.0 with attribution.