U moet een kleine wijziging aanbrengen in uw $project
object. U moet gebruik maken van het Object dat is verkregen bij het aftrekken van 1
van count
, in plaats van de vorige waarde van count
. te gebruiken .
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));
De bovenstaande code zou werken voor groepen met records >= 2
. Als er een enkele groep is met slechts één record, zou de telling na aftrekking nul zijn, wat resulteert in een delen door nul fout.
U kunt uw code dus aanpassen om een $cond0
. is , als dat zo is, zet het dan standaard op 1
, houd anders de afgetrokken waarde van 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));