1

我在 MongoDB 中有一组对象,并且正在使用 Spring Data MongoDB。

我的实体集合如下所示:

--------------------------------------------
| id        | snapshot      | name         |
--------------------------------------------
| 2         | somedate      | bla          |
| 2         | somedate      | foo          |
| 3         | somedate      | bar          |
| 3         | somedate      | cheese       |
| 6         | somedate      | milk         |
| 6         | somedate      | lorum        |
| 6         | somedate      | ipsum        |
| 9         | somedate      | do           |
| 10        | somedate      | re           |
| 10        | somedate      | mi           |
| 15        | somedate      | fa           |    
--------------------------------------------

我想获取一个对象列表,其中我只想拥有每个不同 ID 的一个对象,该 ID 的对象应该是具有最新日期的对象。

我的结果应该是这样的:

--------------------------------------------
| id        | snapshot      | name         |
--------------------------------------------
| 2         | somedate      | bla          |
| 3         | somedate      | bar          |
| 6         | somedate      | milk         |
| 9         | somedate      | do           |
| 10        | somedate      | mi           |
| 15        | somedate      | fa           |    
--------------------------------------------

这可以使用MongoRepository查询吗?我会很感激任何帮助。

4

1 回答 1

1

使用聚合框架是可能的。运行以下聚合操作以获得所需的结果:

db.collection.aggregate([
    { "$sort": { "snapshot": -1 } },
    {
        "$group": {
            "_id": "$id",
            "snapshot": { "$first": "$snapshot" },
            "name": { "$first": "$name" }
        }
    }
])

然后可以将上述原生聚合操作转换为 Spring Data MongoDB 聚合,如下所示:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

TypedAggregation<Entity> aggregation = newAggregation(Entity.class,
    sort(DESC, "snapshot"),
    group("id")
        .first("snapshot").as("snapshot")
        .first("name").as("name")
);

AggregationResults<EntityStats> result = mongoTemplate.aggregate(aggregation, EntityStats.class);
于 2016-04-08T10:25:59.280 回答