docs: def filter(self, cls_or_collection, query, raw=False, only=None):
          """
          Filter objects from the database that correspond to a given set of properties.
  
          See :py:meth:`blitzdb.backends.base.Backend.filter` for documentation of individual parameters
  
          .. note::
  
              This function supports most query operators that are available in MongoDB and returns
              a query set that is based on a MongoDB cursor.
  
          """
  
          if not isinstance(cls_or_collection, six.string_types):
              collection = self.get_collection_for_cls(cls_or_collection)
              cls = cls_or_collection
          else:
              collection = cls_or_collection
              cls = self.get_cls_for_collection(collection)
  
          canonical_query = self._canonicalize_query(query)
  
          args = {}
  
          if only:
              if isinstance(only,tuple):
                  args['projection'] = list(only)
              else:
                  args['projection'] = only
  
          return QuerySet(self, cls, self.db[collection].find(canonical_query, **args), raw=raw, only=only)