Details
Description
> ts.find()
|
{ "time" : ISODate("2023-07-19T20:37:09.316Z"), "meta" : 1, "val" : 5, "_id" : 0 }
|
{ "time" : ISODate("2023-07-19T20:37:31.758Z"), "meta" : 1, "val" : 21, "_id" : 1 }
|
|
// filter by the date of the document with _id: 1
|
> ts.aggregate([{$match: {time: ISODate("2023-07-19T20:37:31.758Z")}}])
|
{ "time" : ISODate("2023-07-19T20:37:31.758Z"), "meta" : 1, "val1" : 3, "val" : 21, "_id" : 1 }
|
|
// add group on the metaField after the filter
|
> ts.aggregate([{$match: {time: ISODate("2023-07-19T20:37:31.758Z")}},{$group: {_id: "$meta", m: {$min: "$val"}}}])
|
{ "_id" : 1, "m" : 5 }
|
The result of the last query is incorrect – it should have been {_id: 1, m: 21}.
The problem doesn't repro if group key isn't the metaField and does repro if filter on any non-metaField.
The problem is with the $group rewrite that replaces "$group": {"_id": "$meta", "m": {"$min": "$val2" }} with "$group": {"_id": "$meta", "m": {"$min": "$control.min.val2"}} without taking in account that the minimum should be computed over a subset of the bucket.