Musíte provést mírnou úpravu svého $project
objekt. Musíte použít objekt, který byl získán odečtením 1
od count
namísto použití předchozí hodnoty 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));
Výše uvedený kód by fungoval pro skupiny, které mají records >= 2
. Pokud existuje jedna skupina pouze s jedním záznamem, počet po odečtení bude nula, což povede k dělení nulou chyba.
Můžete tedy upravit svůj kód tak, aby obsahoval $cond
, abyste zkontrolovali, zda je počet po odečtení 0
, pokud je, pak výchozí 1
, jinak ponechte odečtenou hodnotu 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));