code: def _parse_criteria(self, criteria):
          
          if criteria is None:
              return dict()
          parsed_crit = dict()
          for k, v in self.default_criteria.items():
              if k not in criteria:
                  parsed_crit[self.aliases.get(k, k)] = v
  
          for key, crit in list(criteria.items()):
              if key in ["normalized_formula", "reduced_cell_formula"]:
                  comp = Composition(crit)
                  parsed_crit["pretty_formula"] = comp.reduced_formula
              elif key == "unit_cell_formula":
                  comp = Composition(crit)
                  crit = comp.as_dict()
                  for el, amt in crit.items():
                      parsed_crit["{}.{}".format(self.aliases[key], el)] = amt
                  parsed_crit["nelements"] = len(crit)
                  parsed_crit['pretty_formula'] = comp.reduced_formula
              elif key in ["$or", "$and"]:
                  parsed_crit[key] = [self._parse_criteria(m) for m in crit]
              else:
                  parsed_crit[self.aliases.get(key, key)] = crit
          return parsed_crit
docs: Internal method to perform mapping of criteria to proper mongo queries
          using aliases, as well as some useful sanitization. For example, string
          formulas such as "Fe2O3" are auto-converted to proper mongo queries of
          {"Fe":2, "O":3}.
  
          If 'criteria' is None, returns an empty dict. Putting this logic here
          simplifies callers and allows subclasses to insert something even
          when there are no criteria.