Какова реальная разница между $ project и $ group? - PullRequest
0 голосов
/ 03 ноября 2018

Я прочитал документы и до сих пор не совсем следую им. В соответствии с этим, он возвращает мне конкретные документы в соответствии с моими собственными спецификациями в коллекции. Что касается группировки, то в значительной степени говорит то же самое: «Группирует документы по некоторому указанному выражению и выводит на следующий этап документ для каждой отдельной группировки»

Итак, что на самом деле делает следующий код? Мне кажется это излишним.

BillingCycle.aggregate([{
    $project: {credit: {$sum: "$credits.value"}, debt: {$sum: "debts.value"}}

}, {
    $group: {
        _id: null,
        credit: {$sum: "$credit"}, debt: {$sum: "debt"}
    }
}, {
    $project: {_id: 0, credit: 1, debt: 1   }
}]});

1 Ответ

0 голосов
/ 04 ноября 2018

«Группирует документы по определенному выражению и выводит на следующую стадию документ для каждой отдельной группировки»

Цель $group состоит не только в том, чтобы перенести некоторые поля на следующий этап, но и в сбор некоторого элемента на основе критериев ввода, переданных в атрибуте _id.

С другой стороны, функция $project hand будет исключать / включать какое-либо поле (или пользовательское поле) для следующего этапа. В соответствии с документом вы можете увидеть определение «Передача документов с запрошенными полями к следующему этапу в конвейере. Указанные поля могут быть существующими полями из входных документов или вновь вычисленных полей.»

Существует один случай, если мы подавим _id из $group, тогда он рассчитает накопленные значения для всех входных документов в целом. Который, кажется, действует как $project.

Для запроса на этапе $ project избыточно

BillingCycle.aggregate([ {
    $group: {
        _id: null,
        credit: {$sum: "$credit.value"}, debt: {$sum: "debt.value"}
    }
}, {
    $project: {_id: 0, credit: 1, debt: 1   }
}]});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...