Search code examples
c++mongodbmongo-cxx-driverdatabase

Mongocxx: How to display the documents inversely


I'm trying to display the documents of a collection inversely. In the shell this can be done by making use of the following command:

db.testcollection.find().sort({$natural:-1})

In the documentation I found this function:

void sort(bsoncxx::document::view_or_value ordering);

/// The order in which to return matching documents. If $orderby also exists in the modifiers
/// document, the sort field takes precedence over $orderby.
///
/// @param ordering
///   Document describing the order of the documents to be returned.
///
/// @see http://docs.mongodb.org/manual/reference/method/cursor.sort/

How can I set the natural to -1 like in the shell example? Thanks!


Solution

  • You need to create a sort order document using a bsoncxx builder. Here's an example that inserts 10 documents and dumps them out in reverse order:

    #include <iostream>
    
    #include <bsoncxx/builder/stream/document.hpp>
    #include <bsoncxx/document/value.hpp>
    #include <bsoncxx/document/view.hpp>
    #include <bsoncxx/json.hpp>
    #include <mongocxx/client.hpp>
    #include <mongocxx/collection.hpp>
    #include <mongocxx/instance.hpp>
    #include <mongocxx/options/find.hpp>
    #include <mongocxx/uri.hpp>
    
    using namespace bsoncxx;
    
    int main() {
        auto inst = mongocxx::instance{};
        auto client = mongocxx::client{mongocxx::uri{}};
        auto coll = client["test"]["sorttest"];
        coll.drop();
    
        for (auto i = 0; i < 10; i++) {
            coll.insert_one(builder::stream::document{} << "seq" << i << builder::stream::finalize);
        }
    
        auto order = builder::stream::document{} << "$natural" << -1 << builder::stream::finalize;
    
        auto opts = mongocxx::options::find{};
        opts.sort(order.view());
    
        auto cursor = coll.find({}, opts);
    
        for (auto&& doc : cursor) {
            std::cout << to_json(doc) << std::endl;
        }
    }