>  Q&A  >  본문

java - mongodb分片集群下,count和聚合统计问题

在mongodb分片集群下,直接用count统计会不准确,用聚合统计则可以

但是在java或mongodb客户端(非命令行)调用mongodb,使用聚合统计时,统计的结果和count同样不准确,请问大神们,我的代码如下,请大神指点,找不到原因!

@Test
public void testCount() throws Exception {
    DynamicSqlParameter dsp = new DynamicSqlParameter();
    long sT = System.currentTimeMillis();
    MongoDatasource mongoDatasource = MongoDatasource.getInstance(mongoService.getDatasource());
    DBCollection dbCollection = mongoDatasource.getDB().getCollection("dayFlow");
    List arrayList = new ArrayList<>();
    DBObject dbObject1 = new BasicDBObject();
    dbObject1.put("usedDayFlow", 2);
    DBObject dbObject2 = new BasicDBObject();
    dbObject2.put("_id", null);
    dbObject2.put("count", new BasicDBObject("$sum", 1));
    arrayList.add(new BasicDBObject("$match", dbObject1));
    arrayList.add(new BasicDBObject("$group", dbObject2));
    System.out.println(JSON.serialize(arrayList));
    AggregationOutput size = dbCollection.aggregate(arrayList);
    System.out.println(size.results());
    System.out.println("运行时间:" + ((System.currentTimeMillis() - sT) /1000) + "s");
}

执行结果:

[ { "$match" : { "usedDayFlow" : 2}} , { "$group" : { "_id" : null , "count" : { "$sum" : 1}}}]

[{ "_id" : null , "count" : 1002223}]

该统计结果比实际数据量要多一些,请教大神,对于分片集群的聚合统计要如何操作?

天蓬老师天蓬老师2763일 전778

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 10:53:35

    이 문제는 최신 드라이버 mongo-java-driver-3.4.0을 사용하면 샤딩 클러스터 모드에서 레코드 수를 정확하게 계산할 수 있습니다.

    mongo 쉘 >> db.collection.aggregate([{$match:{categories:"Bakery"},{$group:{"_id":null,"count":{$sum:1}} }}])

    으아아아

    회신하다
    0
  • 阿神

    阿神2017-04-18 10:53:35

    댓글에 정보를 추가해 주실 수 있나요? 감사합니다!

    쉽게 볼 수 있도록 댓글 내용을 여기에 전달하세요.

    1. count와 Aggregate의 차이점: mongoDB에서는 count와 Aggregate가 두 가지 다른 프로그램으로 구현됩니다. Aggregate 구현은 샤드 환경을 고려하므로 공식 문서에서는 샤딩에 Aggregate를 사용할 것을 권장합니다. .

    2. MongoDB 셸에서 집계를 사용하고 Java MongoDB 드라이버를 사용하여 집계를 사용하면 둘 다 집계를 사용하므로 결과는 동일해야 합니다.

    MongoDB 셸과 Java MongoDB 드라이버 간의 카운트 결과가 일관되지 않기 때문에 문제가 발생할 수 있다고 말씀하셨습니다.

    제 생각에 이러한 불일치는 다음과 같습니다.

    으아아아

    참고로.

    MongoDB를 사랑해주세요! 재미있게 보내세요!


    오늘 저녁 8시에는 MongoDB 중국어 커뮤니티 마스터님의 온라인 강의가 있습니다. 이 페이지에 항상 계신 마스터님의 적극적인 참여 부탁드립니다!

    이 링크를 클릭해주세요.

    회신하다
    0
  • 취소회신하다