Трябва да направите лека модификация на вашия $project
обект. Трябва да използвате обекта, получен при изваждане на 1
от count
, вместо да използва предишната стойност на 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));
Горният код ще работи за групи, които имат records >= 2
. Ако има една група само с един запис, броят след изваждане ще бъде нула, което ще доведе до деление на нула грешка.
Така че можете да промените кода си, за да включите $condсилен>
, за да проверите дали броячът след изваждане е 0
, ако е, тогава по подразбиране е 1
, в противен случай запазете извадената стойност на 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));