docs: def to_mongo(self, disjunction=True):
          """Create from current state a valid MongoDB query expression.
  
          :return: MongoDB query expression
          :rtype: dict
          """
          q = {}
          # add all the main clauses to `q`
          clauses = [e.expr for e in self._main]
          if clauses:
              if disjunction:
                  if len(clauses) + len(self._where) > 1:
                      q['$or'] = clauses
                  else:
                      # simplify 'or' of one thing
                      q.update(clauses[0])
              else:
                  for c in clauses:
                      q.update(c)
          # add all the main2 clauses; these are not or'ed
          for c in (e.expr for e in self._main2):
              # add to existing stuff for the field
              for field in c:
                  if field in q:
                      q[field].update(c[field])
                  else:
                      q.update(c)
          # add where clauses, if any, to `q`
          if self._where:
              wsep = ' || ' if self._where[0].is_reversed else ' && '
              where_clause = wsep.join([w.expr for w in self._where])
              if disjunction:
                  if not '$or' in q:
                      q['$or'] = []
                  q['$or'].append({'$where': where_clause})
              else:
                  q['$where'] = where_clause
          return q