I am using Elasticsearch for aggregation,  I want to select userId field and userName field and profit field,  group by userId.  Userid field and username field is 1 to 1 relationship.
The problem is that if I need to have userName in the result json file, I have to make userName as sub aggregation.
The partial code is as such:
"aggs": 
{
	"userid": 
	{
		"terms": 
		{
			"field": "userid",
			"size": 0
		},
		"aggs": 
		{
			"username": 
			{
				"terms": 
				{
					"field": "username",
					"size": 1
				}
			},
			"profit_sum": 
			{
				"sum": 
				{
					"script": "doc['in'].value - doc['out'].value",
					"lang": "expression"
				}
			}
		}
	}
}
Is there any way to select  username as a field without making it a sub term aggregation?
             
            
              
              
              
            
            
           
          
            
            
              If I understand correctly you want to replace the key used in your userid response buckets with the key found in the first (and only) child username bucket.
I don't believe there is a way to do that. Presumably the user names are not unique which is why you want to group at the top level by userid.
This is an age-old issue of computers wanting to work with unique IDs vs people wanting readable labels. I've come to the conclusion that for a lot of analytics use cases with Kibana etc it makes sense to combine IDs and labels into a single token to meet both needs. Something like [436334] John Smith. If you don't do this you always have this issue of how to attach readable labels to aggregation outputs.
             
            
              
              
              
            
            
           
          
            
            
              Sorry, I didn't express clearly. In my current aggregation project, I want to replace mysql database with elasticsearch. it requires me to replace the aggregation code in mysql with elasticsearch.
For example, mysql statement:
select userid, username, profits from mtable group by userid
I want to use elasticsearch to do the same thing. But the problem is that I cannot select the fields I want the response to include, in mysql I can use select as simple as "select userid , username". But in elasticsearch I need to aggregate first on userid, then use sub aggregation  on username , so that I can include the username in the Json response.
it would be good I can choose the fields, I want  aggregation clause to be like the following, is it possible?
"aggs": 
 {
 	"userid": 
 	{
 		"terms": 
 		{
 			"field": "userid",
 			"size": 0
 		},
                "fields" : ["userid", "username"],
 		"profit_sum": 
 		{
			"sum": 
 				{
 					"script": "doc['in'].value - doc['out'].value",
 					"lang": "expression"
 				}
 		}
	}
 }