New MongoDB Drivers for PHP and HHVM: Cursor Behaviour
We released a new version of the MongoDB driver for PHP (the mongodb extension) near the end of last year. In a previous blog post, I covered the back story of the how and why we undertook this effort. And in another post, I spoke about the architecture of the new driver. In this episode I will discuss changes in cursor behaviour.
I recently found the following comment added to the driver's documentation, on PHP.net, which read:
I noticed that
->sortis missing from the cursor. Seems like the old driver has more functionality.
The new driver certainly allows for sorting of results of queries, but no longer by calling the sort() method on the cursor object. This is because cursors are now created differently than in the old mongo extension.
Legacy Driver
In the old driver, the cursor would not really be created until after the first rewind() call on the iterator:
<?php $m = new MongoClient; // Select 'demo' database and 'example' collection $collection = $m->demo->example; // Create the cursor $cursor = $collection->find();
At this moment, although a cursor object had been created, the query had not yet executed (i.e. it was not sent to the server). The query would only be executed by starting iteration with foreach ( $cursor as $result ) or calling $cursor->rewind(). This gives you the chance to configure the cursor's query with sort(), limit(), and skip() before it is executed by the server:
// Add sort, and limit $cursor->sort( [ 'name' => 1 ] )->limit( 40 );
After the cursor starts iterating (through foreach or ->rewind()), you can no longer call the aforementioned methods, as well as other methods that configure the query, to modify the cursor.
New Driver
In the new driver, as soon as you have a \MongoDB\Driver\Cursor object, it has already been processed by the server. Because sort (and limit and skip) parameters need to be sent to the server before the query is executed, you can not retroactively call them on an existing Cursor object.
You can use sort (and limit and skip) with the new driver, but they must be specified as options to the \MongoDB\Driver\Query object before it is passed to \MongoDB\Driver\Manager::executeQuery():
<?php
$m = new \MongoDB\Driver\Manager();
$ns = 'demo.example';
// Create query object with all options:
$query = new \MongoDB\Driver\Query(
[], // query (empty: select all)
[ 'sort' => [ 'name' => 1 ], 'limit' => 40 ] // options
);
// Execute query and obtain cursor:
$cursor = $manager->executeQuery( $ns, $query );
Life Line
I've just finished reading "Schoofhondjes" (lapdogs, in Dutch).
The "Schoof" refers to the previous Dutch prime minister Dick Schoof, being the lapdog of Geert Wilders.
A great collection of columns, although I did need to Google some of the names and references as I hadn't heard about all of them!
Updated a bar; Confirmed a restaurant
Updated 3 restaurants, a vacant shop, and a bar; Confirmed a cosmetics shop, a cafe, and 2 other objects
Created 2 benches and 2 waste_baskets
Deleted a cycle_barrier
Put Kilburn Park station node in a more representable location (not at the back of the building where you can't get in)
Merge branch 'v2022'
Go with 2022.17
Merge branch 'v2022'
Update PHP merging script
Update data to 2026c
Kensal Green sidewalks: Fix alignment and connectivity near station; don't map sidewalks as separate on residential streets for just this tiny section; extend sidewalk mapping on Chamberlayne Road
New building
If you're in London (or Southern England) the ISS is going to make a fly over pass between 23:30 and 23:40 (a little earlier for West of London).
If you're further North than London, the ISS shows further South.
Almost straight overhead. It's going to be bright.
Created a wigs shop
Updated a fitness_centre
Seems I removed the landuse/natural tags
Updated a restaurant
Created a bench
Updated a cafe
But I think my favourite photo was of this Carrion Crow in flight.
The new birds I saw, were mostly too far away to get good photos.
But I saw my first Spoonbill, Corn Bunting, and a flock of Black-tailed Godwits.
I had a lovely walk around RSPB Bowers Marsh yesterday, where I saw some expected birds, and a bunch of new species.
When I got there, there was this welcome committee of Starlings.
#BirdPhotography #nature #BirdsOfFediverse #Birds #Photography #RSPB
RSPB Bowers Marsh







Shortlink
This article has a short URL available: https://drck.me/newmongo3-cer