почему в части карты реализован неявный this
, который ссылается на текущий обрабатываемый документ?
API Map / Reduce для MongoDB был создан в 2009 году, задолго до того, как функции стрелок стали доступны в JavaScript (через ES6 / ES2015). Я могу только строить догадки о намерениях проектирования, но многое изменилось в JavaScript (и MongoDB) с момента первоначальной реализации Map / Reduce.
Ключевое слово this
в методе JavaScript относится к владельцу или контексту выполнения, поэтому установка его на текущий обрабатываемый документ, возможно, была разумным соглашением (или удобством) для использования JavaScript в то время. reduce
функция имеет требуемый прототип function (key, values)
, поэтому прототип map
function (doc)
мог бы быть более последовательным. Однако после выбора API-интерфейса любые существенные критические изменения становятся более сложными для внедрения.
Более современный подход к агрегации может выглядеть совсем по-другому, и это общий путь, по которому следует MongoDB. Aggregation Framework , представленный в MongoDB 2.2 (август 2012 г.), представляет собой более высокопроизводительный подход к агрегированию данных и должен быть предпочтительным (где это возможно) по сравнению с Map / Reduce.
Последующие выпуски сервера MongoDB значительно улучшили функции и производительность Aggregation Framework, в то время как Map / Reduce не претерпела существенных изменений. Например, Aggregation Framework написан на C ++ и способен манипулировать собственными типами данных MongoDB BSON ; Map / Reduce порождает потоки JavaScript и должен распределять данные между BSON и JavaScript.
На практике это также исключает использование функций стрелок в сценариях монго, поскольку эта ссылка не работает с ними.
Действительно. Как и в MongoDB 4.0, функции стрелок не поддерживаются в Map / Reduce. Существует запрос на поддержку функций стрелок, которые можно просматривать / повышать в системе отслеживания ошибок MongoDB: SERVER-34281 .