Adds a projection stage at the query
        :param id: Specifies if the id is in selected fields default value is None
        :param args: The list of the fields that will be project
        :param kwargs: The fields that will be generated
        :return:

def project(self, id=None, *args, **kwargs):
        """
        Adds a projection stage at the query
        :param id: Specifies if the id is in selected fields default value is None
        :param args: The list of the fields that will be project
        :param kwargs: The fields that will be generated
        :return:
        """
        projection = {}

        if id is not None:
            projection['_id'] = id

        for arg in args:
            projection[arg] = 1

        for kwarg in kwargs:
            projection[kwarg] = kwargs[kwarg]

        self._q.append({
            '$project': projection
        })

        return self