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

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

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

天蓬老师
天蓬老师

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

membalas semua(2)
Ty80

Masalah ini telah diselesaikan Pemacu mongo-java-driver-3.4.0 terbaharu digunakan Kaedah berikut boleh digunakan untuk mengira bilangan rekod dalam mod kluster berpecah Terima kasih atas bantuan anda.

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

Bolehkah anda menambah beberapa maklumat dalam ulasan? terima kasih!

Majukan kandungan ulasan di sini untuk tontonan mudah:

1. Perbezaan antara kiraan dan agregat: Dalam mongoDB, kiraan dan agregat dilaksanakan dalam dua program berbeza Pelaksanaan agregat mengambil kira persekitaran serpihan, jadi dokumen rasmi mengesyorkan menggunakan agregat untuk pengiraan dalam persekitaran .

2. Menggunakan agregat di bawah cangkerang MongoDB dan menggunakan pemacu Java MongoDB untuk menggunakan agregat untuk mengira, hasilnya harus sama, kerana kedua-duanya menggunakan agregat.

Anda menyebut bahawa masalahnya mungkin hasil kiraan antara cangkerang MongoDB dan pemacu Java MongoDB adalah tidak konsisten.

Saya rasa ketidakkonsistenan ini mungkin:

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

Untuk rujukan.

Sayangi MongoDB! Selamat Berseronok!


Malam ini pada pukul 8, akan ada kuliah dalam talian oleh tuan komuniti Cina MongoDB Sila ambil bahagian secara aktif;

Sila klik pautan ini.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan