def getall(self):
        try:
            spec = {'data': {'$exists': 1}}
            fields = {'_id': 0}
            sort = [('tid', 1)]
            cur = self.db.docs.find(spec, fields, sort=sort)
        except Exception as e:
            raise DatabaseException(e)
        return [Document(**row) for row in cur]
def _filter_examples_by_class(target_values, downsampling_dict,
                              test_mode=False):
    """Filters examples by target value.

    E = number of examples

    :param target_values: length-E numpy array of target values (integer class
        labels).
    :param downsampling_dict: Dictionary, where each key is the integer
        ID for a target class (-2 for "dead storm") and the corresponding value
        is the number of examples desired from said class.  If
        `downsampling_dict is None`, `example_dict` will be returned
        without modification.
    :param test_mode: Never mind.  Just leave this alone.
    :return: indices_to_keep: 1-D numpy array with indices of examples to keep.
        These are all integers in [0, E - 1].
    """

    num_examples = len(target_values)

    if downsampling_dict is None:
        return numpy.linspace(0, num_examples - 1, num=num_examples, dtype=int)

    indices_to_keep = numpy.array([], dtype=int)
    class_keys = list(downsampling_dict.keys())

    for this_class in class_keys:
        this_num_storm_objects = downsampling_dict[this_class]
        these_indices = numpy.where(target_values == this_class)[0]

        this_num_storm_objects = min(
            [this_num_storm_objects, len(these_indices)]
        )
        if this_num_storm_objects == 0:
            continue

        if test_mode:
            these_indices = these_indices[:this_num_storm_objects]
        else:
            these_indices = numpy.random.choice(
                these_indices, size=this_num_storm_objects, replace=False)

        indices_to_keep = numpy.concatenate((indices_to_keep, these_indices))

    return indices_to_keep