Count and Aggregation Statistics in mongodb Fragmented Cluster

  java, question

Under mongodb fragmented clusters, it is not accurate to use count statistics directly, but it is possible to use aggregate statistics.

clipboard.png

But in java or mongodb client (non-command line) to call mongodb, when using aggregate statistics, the results of statistics and count are also inaccurate. May I ask the Great Gods, my code is as follows, please ask the Great Gods for advice, and no reason can be found!

@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 ("runtime:" plus ((system.currenttimemills ()-st)/1000) plus "s");
 bracket

Results of implementation:

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

[{ “_id” : null , “count” : 1002223}]

This statistical result is a little more than the actual amount of data. Please ask the Great God how to operate the aggregation statistics for fragmented clusters.

This problem has been solved, using the latest driver mongo-java-driver-3.4.0. Through the following methods, the number of records can be accurately counted in the fragmented cluster mode. Thank you for your help!

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

public long getCount() {
 Strinuser = "user name";
 String database = "admin";
 String password = "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 Server Address ("IP Address", "Port"), Arrays. Aslist (Credential), Options);
 
 Get database ("database");
 MongoCollection < Document > Collection = MongoDatabase.getCollection ("Data Table");
 
 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");
 bracket
 };
 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];
 bracket