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

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

831064a6d6406b88a79b901b2a3b81bc.png

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

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

该问题已经解决,使用的是最新驱动mongo-java-driver-3.4.0,通过下面的方法可以在分片集群模式下,准确的统计到记录数量,感谢大家的相助!

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];

}

能否补充一些评论中的信息。多谢!

将评论的内容转发在这里,方便查看:

1、count和aggregate的不同:在mongoDB中,count和aggregate是在两支不同的程序中实现的,aggregate的实现是考虑到了shard的环境的,所以官方文档是推荐使用aggregate来进行shard环境下的count。

2、MongoDB shell下使用aggregate和使用Java MongoDB驱动使用aggregate来进行count,结果应该是一样的,因为两者都是使用的aggregate。

您提到Issue大概是MongoDB shell和Java MongoDB驱动进行count的结果不一致。

这种不一致,我觉得可能是:

1)比较的过程有没有纰漏;

2)所用的Java MongoDB驱动是否有纰漏。

供参考。

Love MongoDB! Have Fun!

今晚8点,MongoDB中文社区大神在线讲座,请大家踊跃参与;此大神常驻本版哦!

请戳此链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值