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

前端 未结 4 643
灰色年华
灰色年华 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:06

    What you want is something that can be achieved with the aggregation framework. The basic form of ( which is useful to others ) is:

    db.collection.aggregate([
    
        // Group by the grouping key, but keep the valid values
        { "$group": {
            "_id": "$chainId",
            "docId": { "$first": "$_id" },
            "messageId": { "$first": "$messageId" },
            "createOn": { "$first": "$createdOn" }
        }},
    
        // Then sort
        { "$sort": { "createOn": -1 } }
    
    ])
    

    So that "groups" on the distinct values of "messageId" while taking the $first boundary values for each of the other fields. Alternately if you want the largest then use $last instead, but for either smallest or largest by row it probably makes sense to $sort first, otherwise just use $min and $max if the whole row is not important.

    See the MongoDB aggregate() documentation for more information on usage, as well as the driver JavaDocs and SpringData Mongo connector documentation for more usage of the aggregate method and possible helpers.

提交回复
热议问题