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

我们要选择具有以下条件的文档的所有字段

  1. 按字段“chainId”区分
  2. order(sort) by 'createdOn' in desc order

所以,预期的结果是

_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 } }

])

这样,在取 $first 时,对“messageId”的不同值进行“分组”每个其他字段的边界值。或者,如果您想要最大的,则使用 $last相反,但对于最小或最大的行,$sort 可能是有意义的首先,否则只需使用 $min$max如果整行不重要。

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

https://stackoverflow.com/questions/23494273/

相关文章:

mongodb - NoSQL 与关系数据库与可能的混合

mongodb - 在 mongo shell 中加载和运行聚合

node.js - 是否可以将额外的参数传递给 Mongoose 更新回调

mongodb - 使用聚合框架按子文档字段分组

javascript - 在 MongoDB 更新语句中使用变量

java - MongoDB Java 驱动程序 : distinct with sort

python - 有人知道 pymongo 中 2dsphere 索引的工作示例吗?

python - Mongodb复制集自动重新连接在nginx + uwsgi上下运行后无法正常工作

mongodb - Meteor.Collection 和 Meteor.Collection.Cu

node.js - NodeJS ExpressJS PassportJS - 仅用于管理页面