Musisz wprowadzić niewielką modyfikację do swojego $project
obiekt. Musisz skorzystać z Object, który został uzyskany po odjęciu 1
od count
, zamiast używać poprzedniej wartości 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));
Powyższy kod działałby dla grup, które mają records >= 2
. Jeśli istnieje pojedyncza grupa z tylko jednym rekordem, liczba po odjęciu będzie wynosić zero, co spowoduje dzielenie przez zero błąd.
Możesz więc zmodyfikować swój kod, tak aby zawierał $cond
, aby sprawdzić, czy liczba po odjęciu wynosi 0
, jeśli tak, domyślnie jest to 1
, w przeciwnym razie zachowaj odjętą wartość 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));