Используя MongoDB, любой простой способ повторно использовать карту / уменьшить результаты? - PullRequest
4 голосов
/ 23 сентября 2010

Например, при выполнении Analytics может быть прогон карты / уменьшения, который занимает 10 секунд.После запуска, если другие веб-страницы могут использовать этот результат, он будет экономить 10 секунд на страницу.

Хорошо будет как-то кэшировать результат карты / уменьшения.

Можно записать успешную карту / уменьшить пробег как map_reduce_result_[timestamp] в БД, а затем сохранить эту метку времени в db.run_log в MongoDB.Эта временная метка, например, является временем эпохи UNIX.Поэтому, когда другим страницам необходим доступ к результату, они могут получить максимальную временную метку, а затем просто просмотреть этот результат, сохраненный в MongoDB.Но это немного похоже на взлом и интересно, есть ли лучшие способы сделать это.

1 Ответ

10 голосов
/ 23 сентября 2010

Ваш подход сохранит каждый результат сокращения карты в отдельной коллекции. Это нормально, если вам нужен доступ к этим «историческим» результатам.

Если вас интересует только результат last , вы можете использовать single collection в качестве кэша. Вы можете указать выходной набор задания уменьшения карты, используя опцию out.

db.collection.mapReduce(map, reduce, { out: "cachedResult" });

Постоянная коллекция cachedResult будет содержать результат.

Как вы можете прочитать в документации , задание сокращения карты все еще будет использовать временную коллекцию при выполнении . Эта временная коллекция атомарно переименовывается в выходную коллекцию по завершении. Это означает, что вы можете безопасно перезапустить задание уменьшения карты , используя тот же набор выходных данных, не беспокоясь о недопустимом кэше при уменьшении карты.

...