private BsonValue visitUnary(Call call, Expression arg) {
      Operator op = call.operator();

      if (op == StringOperators.TO_LOWER_CASE || op == StringOperators.TO_UPPER_CASE) {
        String key = op == StringOperators.TO_LOWER_CASE ? "$toLower" : "$toUpper";
        BsonValue value = arg.accept(this);
        return new BsonDocument(key, value);
      }

      throw new UnsupportedOperationException("Unknown unary call " + call);
    }
Visitor used when special {@code $expr} needs to be generated like {@code field1 == field2}
in mongo it would look like:

<pre>
  {@code
    $expr: {
    $eq: [
      "$field1",
      "$field2"
    ]
  }
  }
</pre>
@see <a href="https://docs.mongodb.com/manual/reference/operator/query/expr/">$expr</a>
criteria/mongo/src/org/immutables/criteria/mongo/FindVisitor.java