Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours777

répondre à tous(2)je répondrai

  • PHP中文网

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

    Ce problème a été résolu. Le dernier pilote mongo-java-driver-3.4.0 est utilisé. La méthode suivante peut être utilisée pour compter avec précision le nombre d'enregistrements en mode cluster fragmenté.

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

        public long getCount() {
                    String user = "用户名";
                    String database = "admin";
                    String password = "密码";
                    MongoCredential credential = MongoCredential.createCredential(user,database, password.toCharArray());
            
                    MongoClientOptions options = MongoClientOptions.builder()
                            .connectionsPerHost(10)
                            .threadsAllowedToBlockForConnectionMultiplier(10)
                            .socketTimeout(20000)
                            .connectTimeout(15000)
                            .maxWaitTime(50000)
                            .build();
            
                    MongoClient mongoClient = new MongoClient(new ServerAddress("IP地址", "端口"), Arrays.asList(credential), options);
            
                    MongoDatabase mongoDatabase = mongoClient.getDatabase("数据库");
                    MongoCollection<Document> collection = mongoDatabase.getCollection("数据表");
            
                    final long[] count = new long[1];
                    Block<Document> printBlock = new Block<Document>() {
                        @Override
                        public void apply(final Document document) {
                             count[0] = (long) document.get("count");
                        }
                    };
                    Bson bson = Filters.eq("categories", "Bakery");
                    collection.aggregate(
                            Arrays.asList(
                                    Aggregates.match(bson),
                                    Aggregates.group(null, Accumulators.sum
                                            ("count", 1L))
                            )
                    ).forEach(printBlock);
            
                    return count[0];
    }

    répondre
    0
  • 阿神

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

    Pouvez-vous ajouter quelques informations dans les commentaires ? Merci!

    Transférez le contenu du commentaire ici pour une visualisation facile :

    1. La différence entre count et Aggregate : Dans mongoDB, Count et Aggregate sont implémentés dans deux programmes différents. L'implémentation de Aggregate prend en compte l'environnement de partitionnement, le document officiel recommande donc d'utiliser Aggregate pour le partitionnement dans l'environnement. .

    2. En utilisant l'agrégat sous le shell MongoDB et en utilisant le pilote Java MongoDB pour utiliser l'agrégat pour compter, les résultats devraient être les mêmes, car les deux utilisent l'agrégat.

    Vous avez mentionné que le problème est probablement dû au fait que les résultats du décompte entre le shell MongoDB et le pilote Java MongoDB sont incohérents.

    Je pense que cette incohérence peut être :

    1)比较的过程有没有纰漏;
    2)所用的Java MongoDB驱动是否有纰漏。
    

    Pour référence.

    J'adore MongoDB ! Amusez-vous!


    Ce soir à 20 heures, il y aura une conférence en ligne du maître de la communauté chinoise MongoDB. Merci de participer activement ; ce maître est toujours sur cette page !

    Veuillez cliquer sur ce lien.

    répondre
    0
  • Annulerrépondre