protected List<Object> getOperationArguments(AggregationOperationContext context) {

      List<Object> result = new ArrayList<Object>(values != null ? values.size() : 1);

      for (Object element : values) {

        if (element instanceof Field) {
          result.add(context.getReference((Field) element).toString());
        } else if (element instanceof Fields) {
          for (Field field : (Fields) element) {
            result.add(context.getReference(field).toString());
          }
        } else if (element instanceof AggregationExpression) {
          result.add(((AggregationExpression) element).toDbObject(context));
        } else {
          result.add(element);
        }
      }

      return result;
    }
  /* (non-Javadoc)
   * @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDBObject(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
   */
  @Override
  public DBObject toDBObject(AggregationOperationContext context) {

    DBObject dbObject = new BasicDBObject();

    dbObject.put(
        "groupBy",
        groupByExpression == null
            ? context.getReference(groupByField).toString()
            : groupByExpression.toDbObject(context));

    if (!outputs.isEmpty()) {
      dbObject.put("output", outputs.toDbObject(context));
    }

    return dbObject;
  }