docs: def _validate_section(self, subject, coll, parts):
          """Validate one section of a spec.
  
          :param subject: Name of subject
          :type subject: str
          :param coll: The collection to validate
          :type coll: pymongo.Collection
          :param parts: Section parts
          :type parts: Validator.SectionParts
          :return: Group of constraint violations, if any, otherwise None
          :rtype: ConstraintViolationGroup or None
          """
          cvgroup = ConstraintViolationGroup()
          cvgroup.subject = subject
  
          # If the constraint is an 'import' of code, treat it differently here
          # if self._is_python(parts):
          #    num_found = self._run_python(cvgroup, coll, parts)
          #    return None if num_found == 0 else cvgroup
  
          query = parts.cond.to_mongo(disjunction=False)
          query.update(parts.body.to_mongo())
          cvgroup.condition = parts.cond.to_mongo(disjunction=False)
          self._log.debug('Query spec: {}'.format(query))
          self._log.debug('Query fields: {}'.format(parts.report_fields))
          # Find records that violate 1 or more constraints
          cursor = coll.find(query, parts.report_fields, **self._find_kw)
          if parts.sampler is not None:
              cursor = parts.sampler.sample(cursor)
          nbytes, num_dberr, num_rec = 0, 0, 0
          while 1:
              try:
                  record = next(cursor)
                  nbytes += total_size(record)
                  num_rec += 1
              except StopIteration:
                  self._log.info("collection {}: {:d} records, {:d} bytes, {:d} db-errors"
                                 .format(subject, num_rec, nbytes, num_dberr))
                  break
              except pymongo.errors.PyMongoError as err:
                  num_dberr += 1
                  if num_dberr > self._max_dberr > 0:
                      raise DBError("Too many errors")
                  self._log.warn("DB.{:d}: {}".format(num_dberr, err))
                  continue
  
              # report progress
              if self._progress:
                  self._progress.update(num_dberr, nbytes)
              # get reasons for badness
              violations = self._get_violations(parts.body, record)
              cvgroup.add_violations(violations, record)
          return None if nbytes == 0 else cvgroup