亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java - mongodb分片集群下,count和聚合統(tǒng)計(jì)問(wèn)題

瀏覽:130日期:2024-01-18 14:17:41

問(wèn)題描述

在mongodb分片集群下,直接用count統(tǒng)計(jì)會(huì)不準(zhǔn)確,用聚合統(tǒng)計(jì)則可以

java - mongodb分片集群下,count和聚合統(tǒng)計(jì)問(wèn)題

但是在java或mongodb客戶端(非命令行)調(diào)用mongodb,使用聚合統(tǒng)計(jì)時(shí),統(tǒng)計(jì)的結(jié)果和count同樣不準(zhǔn)確,請(qǐng)問(wèn)大神們,我的代碼如下,請(qǐng)大神指點(diǎn),找不到原因!

@Testpublic 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('運(yùn)行時(shí)間:' + ((System.currentTimeMillis() - sT) /1000) + 's');}執(zhí)行結(jié)果:

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

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

該統(tǒng)計(jì)結(jié)果比實(shí)際數(shù)據(jù)量要多一些,請(qǐng)教大神,對(duì)于分片集群的聚合統(tǒng)計(jì)要如何操作?

問(wèn)題解答

回答1: 該問(wèn)題已經(jīng)解決,使用的是最新驅(qū)動(dòng)mongo-java-driver-3.4.0,通過(guò)下面的方法可以在分片集群模式下,準(zhǔn)確的統(tǒng)計(jì)到記錄數(shù)量,感謝大家的相助!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('數(shù)據(jù)庫(kù)');MongoCollection<Document> collection = mongoDatabase.getCollection('數(shù)據(jù)表');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];}回答2:

能否補(bǔ)充一些評(píng)論中的信息。多謝!

將評(píng)論的內(nèi)容轉(zhuǎn)發(fā)在這里,方便查看:

1、count和aggregate的不同:在mongoDB中,count和aggregate是在兩支不同的程序中實(shí)現(xiàn)的,aggregate的實(shí)現(xiàn)是考慮到了shard的環(huán)境的,所以官方文檔是推薦使用aggregate來(lái)進(jìn)行shard環(huán)境下的count。

2、MongoDB shell下使用aggregate和使用Java MongoDB驅(qū)動(dòng)使用aggregate來(lái)進(jìn)行count,結(jié)果應(yīng)該是一樣的,因?yàn)閮烧叨际鞘褂玫腶ggregate。

您提到Issue大概是MongoDB shell和Java MongoDB驅(qū)動(dòng)進(jìn)行count的結(jié)果不一致。

這種不一致,我覺(jué)得可能是:

1)比較的過(guò)程有沒(méi)有紕漏;2)所用的Java MongoDB驅(qū)動(dòng)是否有紕漏。

供參考。

Love MongoDB! Have Fun!

今晚8點(diǎn),MongoDB中文社區(qū)大神在線講座,請(qǐng)大家踴躍參與;此大神常駐本版哦!

請(qǐng)戳此鏈接。

標(biāo)簽: java
主站蜘蛛池模板: 91视频老司机 | 九九99久久精品在免费线bt | 黄色一级视频在线播放 | 国产限制路线1线路2线路3 | 免费观看黄视频 | 成人亚洲在线 | 久久婷婷色综合老司机 | 曰本变态bdsm色虐七v | 99久久免费精品国产免费 | 东京加勒比中文字幕波多野结衣 | 日本v片免费一区二区三区 日本wwwwwxxxxx | 性殴美| 久久久久久久岛国免费播放 | 国产亚洲精品色一区 | 羞羞答答www网址进入在线观看 | 人人爽久久涩噜噜噜蜜桃 | 免费看欧美成人性色生活片 | 婷婷丁香视频 | 天天影视色香欲综合网网站麻豆 | 久久精彩免费视频 | 国产欧美日韩中文久久 | 亚洲精品一区二区三区婷婷月 | 日韩在线不卡 | 真人毛片免费观看视频 | 日本一级免费 | 草莓榴莲向日葵十八岁全微糖 | 黄色片一级黄色片 | 1000日本xxxxxxxxx25| 美国三级视频 | 黄网址在线观看 | 看全大色黄大色黄大片一级爽 | 久久88香港三级台湾三级中文 | 久久er热在这里只有精品85 | 亚洲欧美日韩国产精品久久 | 国产欧美一级片 | 成人高清视频在线观看大全 | 国内自拍视频在线播放 | 天天成人 | 久热re国产手机在线观看 | 亚洲国产第一区二区三区 | 黄色网址网站 |