Java 如何在morphia中按计数分组?
我有一个收藏:Java 如何在morphia中按计数分组?,java,mongodb,morphia,nosql-aggregation,Java,Mongodb,Morphia,Nosql Aggregation,我有一个收藏: public class Message { @Id ObjectId id; String group; } 我需要计算每个组的邮件数。是否可以避免遍历整个集合 mongo中的查询语言以及morphia并不真正支持这一点。然而,聚合框架确实如此,这是一个好消息。坏消息是morphia还不支持聚合。实际上,我在一个分支上构建了支持,但它依赖于java驱动程序的2.12版本。以下是跟踪此功能的问题:在此工作示例中,MessageEntry代表Message
public class Message {
@Id
ObjectId id;
String group;
}
我需要计算每个组的邮件数。是否可以避免遍历整个集合 mongo中的查询语言以及morphia并不真正支持这一点。然而,聚合框架确实如此,这是一个好消息。坏消息是morphia还不支持聚合。实际上,我在一个分支上构建了支持,但它依赖于java驱动程序的2.12版本。以下是跟踪此功能的问题:在此工作示例中,MessageEntry代表Message,linf代表group:
DBCollection myColl = ds.getCollection(MessageEntry.class);
DBObject key = new BasicDBObject("linf",true);
DBObject initial = new BasicDBObject("cnt",true);
String reduce = "function(item,prev){prev.cnt+=1;}";
DBObject group = myColl.group(key, null, initial, reduce);
HashMap<String,Long> ret = new HashMap();
for(String k:group.keySet()){
BasicDBObject l = (BasicDBObject) group.get(k);
DBRef dbRef = (DBRef) l.get("linf");
Linf linf = ds.get(Linf.class,dbRef.getId() );
Double cnt = (Double) l.get("cnt");
ret.put(linf.limad,cnt.longValue());
}
return ret;
DBCollection myColl=ds.getCollection(MessageEntry.class);
DBObject key=newBasicDBObject(“linf”,true);
DBObject initial=新的基本对象(“cnt”,true);
String reduce=“function(item,prev){prev.cnt+=1;}”;
DBObject group=myColl.group(key,null,initial,reduce);
HashMap ret=新的HashMap();
对于(字符串k:group.keySet()){
BasicDBObject l=(BasicDBObject)group.get(k);
DBRef DBRef=(DBRef)l.get(“linf”);
Linf Linf=ds.get(Linf.class,dbRef.getId());
双cnt=(双)l.get(“cnt”);
ret.put(linf.limad,cnt.longValue());
}
返回ret;
很抱歉这个愚蠢的问题。那么,是否可以通过对mongodb的请求而不在java中进行迭代来实现这一点呢?在哪里可以看到示例?塔克斯。