docs: def find_one_and_replace(self, filter, replacement,
                               projection=None, sort=None, upsert=False,
                               return_document=ReturnDocument.BEFORE, **kwargs):
          """Finds a single document and replaces it, returning either the
          original or the replaced document.
  
          The :meth:`find_one_and_replace` method differs from
          :meth:`find_one_and_update` by replacing the document matched by
          *filter*, rather than modifying the existing document.
  
            >>> for doc in db.test.find({}):
            ...     print(doc)
            ...
            {u'x': 1, u'_id': 0}
            {u'x': 1, u'_id': 1}
            {u'x': 1, u'_id': 2}
            >>> db.test.find_one_and_replace({'x': 1}, {'y': 1})
            {u'x': 1, u'_id': 0}
            >>> for doc in db.test.find({}):
            ...     print(doc)
            ...
            {u'y': 1, u'_id': 0}
            {u'x': 1, u'_id': 1}
            {u'x': 1, u'_id': 2}
  
          :Parameters:
            - `filter`: A query that matches the document to replace.
            - `replacement`: The replacement document.
            - `projection` (optional): A list of field names that should be
              returned in the result document or a mapping specifying the fields
              to include or exclude. If `projection` is a list "_id" will
              always be returned. Use a mapping to exclude fields from
              the result (e.g. projection={'_id': False}).
            - `sort` (optional): a list of (key, direction) pairs
              specifying the sort order for the query. If multiple documents
              match the query, they are sorted and the first is replaced.
            - `upsert` (optional): When ``True``, inserts a new document if no
              document matches the query. Defaults to ``False``.
            - `return_document`: If
              :attr:`ReturnDocument.BEFORE` (the default),
              returns the original document before it was replaced, or ``None``
              if no document matches. If
              :attr:`ReturnDocument.AFTER`, returns the replaced
              or inserted document.
            - `**kwargs` (optional): additional command arguments can be passed
              as keyword arguments (for example maxTimeMS can be used with
              recent server versions).
  
          .. versionchanged:: 3.4
             Added the `collation` option.
          .. versionchanged:: 3.2
             Respects write concern.
  
          .. warning:: Starting in PyMongo 3.2, this command uses the
             :class:`~pymongo.write_concern.WriteConcern` of this
             :class:`~pymongo.collection.Collection` when connected to MongoDB >=
             3.2. Note that using an elevated write concern with this command may
             be slower compared to using the default write concern.
  
          .. versionadded:: 3.0
          """
          common.validate_ok_for_replace(replacement)
          kwargs['update'] = replacement
          return self.__find_and_modify(filter, projection,
                                        sort, upsert, return_document, **kwargs)