Mongodb select all fields group by one field and sort by another field

前端 未结 4 645
灰色年华
灰色年华 2021-02-09 03:44

We have collection \'message\' with following fields

_id |   messageId |  chainId | createOn

1   |       1     |    A     | 155
2   |       2     |    A     | 1         


        
4条回答
  •  盖世英雄少女心
    2021-02-09 04:24

    here is the solution using MongoDB Java Driver

        final MongoClient mongoClient = new MongoClient();
        final DB db = mongoClient.getDB("mstreettest");
        final DBCollection collection = db.getCollection("message");
    
        final BasicDBObject groupFields = new BasicDBObject("_id", "$chainId");
        groupFields.put("docId", new BasicDBObject("$first", "$_id"));
        groupFields.put("messageId", new BasicDBObject("$first", "$messageId"));
        groupFields.put("createOn", new BasicDBObject("$first", "$createdOn"));
    
        final DBObject group = new BasicDBObject("$group", groupFields);
    
        final DBObject sortFields = new BasicDBObject("createOn", -1);
        final DBObject sort = new BasicDBObject("$sort", sortFields);
    
        final DBObject projectFields = new BasicDBObject("_id", 0);
        projectFields.put("_id", "$docId");
        projectFields.put("messageId", "$messageId");
        projectFields.put("chainId", "$_id");
        projectFields.put("createOn", "$createOn");
        final DBObject project = new BasicDBObject("$project", projectFields);
    
        final AggregationOutput aggregate = collection.aggregate(group, sort, project);
    

    and the result will be:

    { "_id" : 5 , "messageId" : 5 , "createOn" : { "$date" : "2014-04-23T04:45:45.173Z"} , "chainId" : "C"}
    { "_id" : 4 , "messageId" : 4 , "createOn" : { "$date" : "2014-04-23T04:12:25.173Z"} , "chainId" : "B"}
    { "_id" : 1 , "messageId" : 1 , "createOn" : { "$date" : "2014-04-22T08:29:05.173Z"} , "chainId" : "A"}
    

    I tried it with SpringData Mongo and it didn't work when I group it by chainId(java.lang.NumberFormatException: For input string: "C") was the exception

提交回复
热议问题