Vous devez apporter une légère modification à votre $project
objet. Vous devez utiliser l'Objet qui a été obtenu en soustrayant 1
de count
, plutôt que d'utiliser la valeur précédente de count
.
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",countAfterSubtraction});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));
Le code ci-dessus fonctionnerait pour les groupes qui ont records >= 2
. S'il y a un seul groupe avec un seul enregistrement, le décompte après soustraction serait égal à zéro, ce qui entraînerait une division par zéro erreur.
Vous pouvez donc modifier votre code pour inclure un $cond
, pour vérifier si le compte après soustraction est 0
, si c'est le cas, alors la valeur par défaut est 1
, sinon conservez la valeur soustraite de count
.
DBObject project = new BasicDBObject("_id", 0);
DBObject countAfterSubtraction = new BasicDBObject("$subtract",
new Object[] {"$count", 1});
DBObject eq = new BasicDBObject("$eq",
new Object[]{countAfterSubtraction,0});
DBObject cond = new BasicDBObject("$cond",
new Object[]{eq,1,countAfterSubtraction});
DBObject value = new BasicDBObject("$divide",
new Object[] {"$value",cond});
project.put("value", value);
project.put("Date", "$_id");
stages.add(new BasicDBObject("$project", project));