cursor collection::find(view_or_value filter, const options::find& options) {
    using namespace bsoncxx;
    builder::stream::document filter_builder;
    scoped_bson_t filter_bson;
    scoped_bson_t projection{options.projection()};

    filter_builder << "$query" << bsoncxx::types::b_document{filter};

    if (options.modifiers()) {
        filter_builder << builder::stream::concatenate(*options.modifiers());
    }

    if (options.sort()) {
        filter_builder << "$orderby" << bsoncxx::types::b_document{*options.sort()};
    }

    if (options.max_time()) {
        filter_builder << "$maxTimeMS" << options.max_time()->count();
    }

    if (options.hint()) {
        filter_builder << builder::stream::concatenate(options.hint()->to_document());
    }

    if (options.comment()) {
        filter_builder << "$comment" << *options.comment();
    }

    filter_bson.init_from_static(filter_builder.view());

    const mongoc_read_prefs_t* rp_ptr = NULL;

    if (options.read_preference()) {
        rp_ptr = options.read_preference()->_impl->read_preference_t;
    }

    auto mongoc_cursor = libmongoc::collection_find(
        _get_impl().collection_t, mongoc_query_flags_t(0), options.skip().value_or(0),
        options.limit().value_or(0), options.batch_size().value_or(0), filter_bson.bson(),
        projection.bson(), rp_ptr);

    if (options.max_await_time()) {
        const auto count = options.max_await_time()->count();
        if ((count < 0) || (count >= std::numeric_limits<std::uint32_t>::max()))
            throw logic_error{make_error_code(error_code::k_invalid_parameter)};
        libmongoc::cursor_set_max_await_time_ms(mongoc_cursor, static_cast<std::uint32_t>(count));
    }

    return cursor{mongoc_cursor};
}
Beispiel #2
0
cursor collection::find(view_or_value filter, const options::find& options) {
    using namespace bsoncxx;
    builder::stream::document filter_builder;
    scoped_bson_t filter_bson;
    scoped_bson_t projection{options.projection()};

    filter_builder << "$query" << bsoncxx::types::b_document{filter};

    if (options.modifiers()) {
        filter_builder << builder::stream::concatenate(*options.modifiers());
    }

    if (options.sort()) {
        filter_builder << "$orderby" << bsoncxx::types::b_document{*options.sort()};
    }

    if (options.max_time()) {
        filter_builder << "$maxTimeMS" << options.max_time()->count();
    }

    if (options.hint()) {
        filter_builder << builder::stream::concatenate(options.hint()->to_document());
    }

    filter_bson.init_from_static(filter_builder.view());

    const mongoc_read_prefs_t* rp_ptr = NULL;

    if (options.read_preference()) {
        rp_ptr = options.read_preference()->_impl->read_preference_t;
    }

    auto mongoc_cursor = libmongoc::collection_find(
        _get_impl().collection_t, mongoc_query_flags_t(0), options.skip().value_or(0),
        options.limit().value_or(0), options.batch_size().value_or(0), filter_bson.bson(),
        projection.bson(), rp_ptr);

    if (options.max_await_time()) {
        libmongoc::cursor_set_max_await_time_ms(mongoc_cursor, (*options.max_await_time()).count());
    }

    return cursor{mongoc_cursor};
}