protected FilterDefinition<MyData> ComposeFilter(FilterParams filterParams)
    {
        filterParams = filterParams ?? new FilterParams();

        var builder = Builders<MyData>.Filter;
        var filter = builder.Empty;

        var key = filterParams.GetAsNullableString("key");

        if (key != null)
            filter &= builder.Eq("key", key);

        return filter;
    }

    protected SortDefinition<MyData> ComposeSort(SortParams sortParams)
    {
        sortParams = sortParams ?? new SortParams();

        var builder = Builders<MyData>.Sort;
        var sortDefinitions = new List<SortDefinition<MyData>>();

        foreach (var field in sortParams)
        {
            if (field.Ascending)
                sortDefinitions.Add(builder.Ascending(field.Name));
            else
                sortDefinitions.Add(builder.Descending(field.Name));
        }

        var sort = builder.Combine(sortDefinitions);

        return sort;
    }