java – Mongodb选择所有字段按一个字段分组并按另一个字段排序

我们有以下字段的集合’消息’
_id |   messageId |  chainId | createOn

1   |       1     |    A     | 155
2   |       2     |    A     | 185
3   |       3     |    A     | 225
4   |       4     |    B     | 226
5   |       5     |    C     | 228
6   |       6     |    B     | 300

我们希望按照以下标准选择所有文档字段

>通过字段’chainId’进行干扰
>按desc顺序按’createdOn’排序(排序)

所以,预期的结果是

_id |   messageId |  chainId | createOn

3   |       3     |    A     | 225
5   |       5     |    C     | 228
6   |       6     |    B     | 300

我们在java应用程序中使用spring-data.我尝试采用不同的方法,到目前为止没有任何帮助.
是否有可能通过单一查询实现上述目标?

解决方法

您想要的是可以通过聚合框架实现的功能. (对其他人有用)的基本形式是:
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 } }

])

这样就可以在“messageId”的不同值上“分组”,同时为每个其他字段获取$first个边界值.或者,如果你想要最大,那么使用$last代替,但是对于最小或最大的行,它可能首先对$sort有意义,否则只要使用$min$max,如果整行不重要.

有关使用的更多信息,请参阅MongoDB aggregate()文档,以及驱动程序JavaDocs和SpringData Mongo连接器文档,以获取聚合方法和可能的帮助程序的更多用法.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...