def METHOD_NAME(
    self, criteria: Dict[str, Any], single_entry: bool = False
) -> Tuple[List[Dict[str, Any]], int, bool]:
    """Run the query on the backend and collect the results.
    Arguments:
        criteria: A dictionary representation of the query parameters.
        single_entry: Whether or not the caller is expecting a single entry response.
    Returns:
        The list of entries from the database (without any re-mapping), the total number of
        entries matching the query and a boolean for whether or not there is more data available.
    """
    results = list(self.collection.find(**criteria))
    if CONFIG.database_backend == SupportedBackend.MONGOMOCK and criteria.get(
        "projection", {}
    ).get("_id"):
        # mongomock does not support `$toString`` in projection, so we have to do it manually
        for ind, doc in enumerate(results):
            results[ind]["_id"] = str(doc["_id"])
    nresults_now = len(results)
    if not single_entry:
        criteria_nolimit = criteria.copy()
        criteria_nolimit.pop("limit", None)
        skip = criteria_nolimit.pop("skip", 0)
        data_returned = self.count(**criteria_nolimit)
        more_data_available = nresults_now + skip < data_returned
    else:
        # SingleEntryQueryParams, e.g., /structures/{entry_id}
        data_returned = nresults_now
        more_data_available = False
    return results, data_returned, more_data_available