java - mongodb分片集群下,count和聚合统计问题
天蓬老师
天蓬老师 2017-04-18 10:51:35
0
2
797

在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}]

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(2)
Ty80

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];
}
阿神

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal