Maison > Questions et réponses > le corps du texte
@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}]
PHP中文网2017-04-18 10:53:35
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];
}
阿神2017-04-18 10:53:35
Pouvez-vous ajouter quelques informations dans les commentaires ? Merci!
Transférez le contenu du commentaire ici pour une visualisation facile :
1. La différence entre count et Aggregate : Dans mongoDB, Count et Aggregate sont implémentés dans deux programmes différents. L'implémentation de Aggregate prend en compte l'environnement de partitionnement, le document officiel recommande donc d'utiliser Aggregate pour le partitionnement dans l'environnement. .
2. En utilisant l'agrégat sous le shell MongoDB et en utilisant le pilote Java MongoDB pour utiliser l'agrégat pour compter, les résultats devraient être les mêmes, car les deux utilisent l'agrégat.
Vous avez mentionné que le problème est probablement dû au fait que les résultats du décompte entre le shell MongoDB et le pilote Java MongoDB sont incohérents.
Je pense que cette incohérence peut être :
1)比较的过程有没有纰漏;
2)所用的Java MongoDB驱动是否有纰漏。
Pour référence.
J'adore MongoDB ! Amusez-vous!
Ce soir à 20 heures, il y aura une conférence en ligne du maître de la communauté chinoise MongoDB. Merci de participer activement ; ce maître est toujours sur cette page !
Veuillez cliquer sur ce lien.