Recursively marshal a Python object to a BSON-compatible dict
        that can be passed to PyMongo, Motor, etc...

    Args:
        obj:    object, It's members can be nested Python
                objects which will be converted to dictionaries
        types:  tuple-of-types, The BSON primitive types, typically
                you would not change this
        fields: None-list-of-str, Explicitly marshal only these fields
    Returns:
        dict

def marshal_bson(
    obj,
    types=BSON_TYPES,
    fields=None,
):
    """ Recursively marshal a Python object to a BSON-compatible dict
        that can be passed to PyMongo, Motor, etc...

    Args:
        obj:    object, It's members can be nested Python
                objects which will be converted to dictionaries
        types:  tuple-of-types, The BSON primitive types, typically
                you would not change this
        fields: None-list-of-str, Explicitly marshal only these fields
    Returns:
        dict
    """
    return marshal_dict(
        obj,
        types,
        fields=fields,
    )