首頁  >  問答  >  主體

java - mongodb框架morphia中怎么去重?

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

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

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

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

高洛峰高洛峰2764 天前780

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 15:17:00

    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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 15:17:00

    呼叫com.mongodb.DBCollection#distinct方法,對應問題中的命令列 db.collection.distinct("someField")
    這樣會把所有的資料都回傳,所以如果只是為了得到count,沒必要用distinct。
    可以直接用aggregate。

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

    回覆
    0
  • 取消回覆