Почему MongoDB map-Reduce подразумевает это - PullRequest
0 голосов
/ 02 ноября 2018

Использование карты сокращено следующим образом

db.myCollection.mapReduce(function() {
  emit(this.smth);
},
function(key, values) {
  // return something done with key and values
});

Мой вопрос: почему в части карты реализован неявный this, который ссылается на текущий обрабатываемый документ? ИМО, было бы чётче передать текущий документ в качестве аргумента функции карты (я предпочитаю писать весь свой JavaScript без this).

На практике это также исключает использование функций стрелок в скриптах монго, так как эта ссылка не работает с ними.

1 Ответ

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

почему в части карты реализован неявный 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 .

...