docs: def get_sample(self, md5):
          """Get the sample from the data store.
  
          This method first fetches the data from datastore, then cleans it for serialization
          and then updates it with 'raw_bytes' item.
          
          Args:
              md5: The md5 digest of the sample to be fetched from datastore.
  
          Returns:
              The sample dictionary or None
          """
  
          # Support 'short' md5s but don't waste performance if the full md5 is provided
          if len(md5) < 32:
              md5 = self.get_full_md5(md5, self.sample_collection)
  
          # Grab the sample
          sample_info = self.database[self.sample_collection].find_one({'md5': md5})
          if not sample_info:
              return None
  
          # Get the raw bytes from GridFS (note: this could fail)
          try:
              grid_fs_id = sample_info['__grid_fs']
              sample_info = self.clean_for_serialization(sample_info)
              sample_info.update({'raw_bytes':self.gridfs_handle.get(grid_fs_id).read()})
              return sample_info
          except gridfs.errors.CorruptGridFile:
              # If we don't have the gridfs files, delete the entry from samples
              self.database[self.sample_collection].update({'md5': md5}, {'md5': None})
              return None