mongodb框架morphia中怎么去重?


需求:对表数据进行分组后,根据某个字段去重,然后在count

命令行有 db.collection.distinct("someField")

问:用morphia应该怎么写?或者通过原生的mongodb驱动应该怎么做?

如果用聚合的话,怎么才能当查询的结果为null时统计的数量为0,比如sql中的 isNull(count(1), 0)

morphia java mongodb

真青驴霸王 9 years, 5 months ago

调用 com.mongodb.DBCollection#distinct 方法,对应问题中的命令行 db.collection.distinct("someField")
这样会把所有的数据都返回,所以如果只是为了得到count,没必要用distinct。
可以直接用aggregate。


 db.collection.aggregate(
    [{
        $group:{
            _id:"$someField",
            count:{$sum:1}
        }
    }]
)

断绝后工口 answered 9 years, 5 months ago


 BasicDBObject group1 = new BasicDBObject();
BasicDBObject _id = new BasicDBObject();
_id.put("field1", "$field1");
_id.put("field2", "$field2");
group1.put("_id", _id);
BasicDBObject group2 = new BasicDBObject();
group2.put("_id", "$_id.field1");
group2.put("statCnt", new BasicDBObject("$sum", 1));

List<DBObject> aggParam = new ArrayList<>();
aggParam.add(new BasicDBObject("$match", match));
aggParam.add(new BasicDBObject("$group", group1));
aggParam.add(new BasicDBObject("$group", group2));
aggParam.add(new BasicDBObject("$sort", sort));
aggParam.add(new BasicDBObject("$limit", 10));

AggregationOutput output = collection.aggregate(aggParam);

这是我实际用到的代码,简单的说就是用了两次group,达到分组都对某个字段去重的目的

参考: http://www.cnblogs.com/lori/p/4597341.html

AKIKO answered 9 years, 5 months ago

Your Answer