Show
Step 1: sample data points to use for reproducing this bug:
db.sample_for_bug.insertMany([
{ "group_a" : "abc" , "group_b" : "cde" , "group_c" : "ghi" , "amt" : 96 },
{ "group_a" : "abc" , "group_b" : "cde" , "group_c" : "hij" , "amt" : 79 },
{ "group_a" : "abc" , "group_b" : "def" , "group_c" : "ijk" , "amt" : 33 },
{ "group_a" : "abc" , "group_b" : "def" , "group_c" : "jkl" , "amt" : 20 },
{ "group_a" : "bcd" , "group_b" : "efg" , "group_c" : "klm" , "amt" : 67 },
{ "group_a" : "bcd" , "group_b" : "efg" , "group_c" : "lmn" , "amt" : 9 },
{ "group_a" : "bcd" , "group_b" : "fgh" , "group_c" : "mno" , "amt" : 23 },
{ "group_a" : "bcd" , "group_b" : "fgh" , "group_c" : "nop" , "amt" : 11 }
])
Step 2: the aggregate that fails to use the (last) $avg accurately:
db.sample_for_bug.aggregate([
{$group: {
_id: {a: "$group_a" , b: "$group_b" , c: "$group_c" },
amt: {$avg: "$amt" }
}},
{$group: {
_id: {a: "$_id.a" , b: "$_id.b" },
amt: {$sum: "$amt" }
}},
{$group: {_id: '' , amt: {$avg: "$amt" }}}
])
Step 3: add in some non- $group aggregate command ahead of the last $group and the results are returned accurately:
db.sample_for_bug.aggregate([
{$group: {
_id: {a: "$group_a" , b: "$group_b" , c: "$group_c" },
amt: {$avg: "$amt" }
}},
{$group: {
_id: {a: "$_id.a" , b: "$_id.b" },
amt: {$sum: "$amt" }
}},
{$match: {amt: {$exists: true }}},
{$group: {_id: '' , amt: {$avg: "$amt" }}}
])