Devi apportare una leggera modifica al tuo $project
oggetto. Devi utilizzare l'Oggetto ottenuto sottraendo 1
da count
, invece di utilizzare il valore precedente di 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));
Il codice sopra funzionerebbe per i gruppi che hanno records >= 2
. Se esiste un singolo gruppo con un solo record, il conteggio dopo la sottrazione sarebbe zero, risultando in una divisione per zero errore.
Quindi potresti modificare il tuo codice, per includere un $cond
, per verificare se il conteggio dopo la sottrazione è 0
, se lo è, impostalo come predefinito su 1
, altrimenti mantieni il valore sottratto di 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));