diff --git a/source/tutorial/create-tailable-cursor.txt b/source/tutorial/create-tailable-cursor.txt index 2464d69ee16..0c75e1eec90 100644 --- a/source/tutorial/create-tailable-cursor.txt +++ b/source/tutorial/create-tailable-cursor.txt @@ -55,119 +55,3 @@ Consider the following behaviors related to tailable cursors: See your :doc:`driver documentation ` for the driver-specific method to specify the tailable cursor. - -C++ Example ------------ - -The ``tail`` function uses a tailable cursor to output the results from -a query to a capped collection: - -- The function handles the case of the dead cursor by having the query - be inside a loop. - -- To periodically check for new data, the ``cursor->more()`` statement - is also inside a loop. - -.. code-block:: cpp - - #include "client/dbclient.h" - - using namespace mongo; - - /* - * Example of a tailable cursor. - * The function "tails" the capped collection (ns) and output elements as they are added. - * The function also handles the possibility of a dead cursor by tracking the field 'insertDate'. - * New documents are added with increasing values of 'insertDate'. - */ - - void tail(DBClientBase& conn, const char *ns) { - - BSONElement lastValue = minKey.firstElement(); - - Query query = Query().hint( BSON( "$natural" << 1 ) ); - - while ( 1 ) { - auto_ptr c = - conn.query(ns, query, 0, 0, 0, - QueryOption_CursorTailable | QueryOption_AwaitData ); - - while ( 1 ) { - if ( !c->more() ) { - - if ( c->isDead() ) { - break; - } - - continue; - } - - BSONObj o = c->next(); - lastValue = o["insertDate"]; - cout << o.toString() << endl; - } - - query = QUERY( "insertDate" << GT << lastValue ).hint( BSON( "$natural" << 1 ) ); - } - } - -The ``tail`` function performs the following actions: - -- Initialize the ``lastValue`` variable, which tracks the last - accessed value. The function will use the ``lastValue`` if the - cursor becomes *invalid* and ``tail`` needs to restart the - query. Use :method:`~cursor.hint()` to ensure that the query uses - the :operator:`$natural` order. - -- In an outer ``while(1)`` loop, - - - Query the capped collection and return a tailable cursor that - blocks for several seconds waiting for new documents - - .. code-block:: cpp - - auto_ptr c = - conn.query(ns, query, 0, 0, 0, - QueryOption_CursorTailable | QueryOption_AwaitData ); - - - Specify the capped collection using ``ns`` as an argument - to the function. - - - Set the ``QueryOption_CursorTailable`` option to create a - tailable cursor. - - - Set the ``QueryOption_AwaitData`` option so that the returned - cursor blocks for a few seconds to wait for data. - - - In an inner ``while (1)`` loop, read the documents from the cursor: - - - If the cursor has no more documents and is not invalid, loop the - inner ``while`` loop to recheck for more documents. - - - If the cursor has no more documents and is dead, break the inner - ``while`` loop. - - - If the cursor has documents: - - - output the document, - - - update the ``lastValue`` value, - - - and loop the inner ``while (1)`` loop to recheck for more - documents. - - - If the logic breaks out of the inner ``while (1)`` loop and the - cursor is invalid: - - - Use the ``lastValue`` value to create a new query condition that - matches documents added after the ``lastValue``. Explicitly - ensure ``$natural`` order with the ``hint()`` method: - - .. code-block:: cpp - - query = QUERY( "insertDate" << GT << lastValue ).hint( BSON( "$natural" << 1 ) ); - - - Loop through the outer ``while (1)`` loop to re-query with the new query - condition and repeat. - -.. seealso:: `Detailed blog post on tailable cursor `_