TLDR;
Еквивалентът на mongoose би бил първо да се изпълни вложената заявка и резултатите да се предадат на агрегацията.
groups.distinct("p", {"enable": true}).exec().then(matchingGroups => {
return users.aggregate([
{$match: {"id": {$in: ["0", "1", "2"]}, p: {$in: matchingGroups}}},
{$group:{_id:"$v", number:{$sum:1 }}}
]).exec();
}).then(aggregationResult => {
console.log(aggregationResult);
});
Обяснение
Когато изпълнявате следния скрипт в mongo shell, това, което се случва, е, че първо се изпраща вътрешната заявка (distinct), а след това резултатът се предава на външната заявка (агрегиране), която след това се изпраща за изпълнение. Това може да бъде потвърдено чрез заснемане на проследяване на пакет. В прикачените изображения можем да видим първото изпращане на заявка (пакет 9) полученият отговор (пакети 10 и 11) и изпращане на заявка за агрегиране (пакети 12 и 13).