@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}}}}])
能否補充一些評論中的資訊。多謝!
將評論的內容轉發在這裡,方便查看:
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的結果不一致。
這種不一致,我覺得可能是:
供參考。
Love MongoDB! Have Fun!
今晚8點,MongoDB中文社群大神線上講座,請大家踴躍參與;此大神常駐本版喔!
請戳此連結。