我有一个集合,我从中获得使用$ 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)
Run Code Online (Sandbox Code Playgroud)
你不能做一个排序,然后限制,然后排序.Cursor对象正是如此,它将不会运行查询,直到您迭代到第一个结果,通过getNext()该结果手动运行或foreach不仅在循环内,但sort只是对象的属性,因此使两个排序只是覆盖属性.
实现您所寻求目标的最佳方式是:
$doc = $collection->find($query)->sort(array('user_id' => 1))
->skip(1999)->limit(1)->getNext();
Run Code Online (Sandbox Code Playgroud)
这将始终选择组中的最高值user_id(在此类末尾发生),这将产生与进行两种排序相同的结果.
| 归档时间: |
|
| 查看次数: |
11004 次 |
| 最近记录: |