我们有以下字段的集合’消息’
_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连接器文档,以获取聚合方法和可能的帮助程序的更多用法.