0

我的 mongodb 中有一个文档,看起来像这样 -

public class AppCheckInRequest {
    private String _id;
    private String uuid;
    private Date checkInDate;
    private Double lat;
    private Double lon;
    private Double altitude;
}
  • 数据库将包含具有相同 uuid 但不同 checkInDates 的多个文档

问题

我想使用 java 运行一个 mongo 查询,它为每个 uuid 提供一个 AppCheckInRequest 文档(所有字段),其 checkInDate 最接近当前时间。

我相信我必须聚合框架,但我无法弄清楚如何获得我需要的结果。谢谢。

4

1 回答 1

2

在 mongo 外壳中:-

这将为您提供整个分组:

db.items.aggregate({$group : {_id : "$uuid" , value : { $push : "$somevalue"}}} )

并且使用 $first 而不是 $push 只会从每个中放一个(我想这是你想要的吗?):

db.items.aggregate({$group : {_id : "$uuid" , value : { $first : "$somevalue"}}} )

你能把它翻译成Java api吗?或者我也会尝试添加它。

...好的,这是一些Java:

假设我的集合中的文档是 {_id : "someid", name: "somename", value: "some value"} 那么此代码显示它们按名称分组:

 Mongo client = new Mongo("127.0.0.1");

    DBCollection col = client.getDB("ajs").getCollection("items");

    AggregationOutput agout = col.aggregate(
           new BasicDBObject("$group",
                   new BasicDBObject("_id", "$name").append("value", new BasicDBObject("$push", "$value"))));

    Iterator<DBObject> results = agout.results().iterator();


   while(results.hasNext()) {
     DBObject obj = results.next();

     System.out.println(obj.get("_id")+" "+obj.get("value"));

  }

如果您将 $push 更改为 $first,则每组只能获得 1 个。然后,您可以在此查询正常工作后添加其余字段。

于 2013-10-05T21:50:07.323 回答