Общий совет, касающийся Map Reduce, заключается в том, чтобы ваше приложение выполняло немного больше вычислений для каждой вставки, и по возможности избегайте работы по сокращению карты с интенсивным использованием процессора.
Можно ли добавить поле «популярность» к каждому документу «публикация», и ваше приложение будет увеличивать его каждый раз, когда каждое сообщение просматривается, нажимается, голосуется или как вы измеряете популярность?Затем вы можете проиндексировать поле популярности, и поиск сообщений по популярности будет молниеносным.
Если простое увеличение поля «популярность» не является опцией, и необходимо выполнить операцию MapReduce, попытайтесь не допустить, чтобы он просматривал все документы в коллекции.Вы обнаружите, что это становится непомерно медленным по мере роста вашей коллекции.Похоже, ваша коллекция уже довольно большая.
Возможно выполнить инкрементное уменьшение карты, когда результаты последнего сокращения карты интегрируются с результатами предыдущего, а не просто перезаписываются.Вы также можете предоставить запрос в функцию mapReduce, чтобы не все документы были прочитаны.Возможно, добавьте запрос, который соответствует только сообщениям, которые были просмотрены, проголосовали или добавлены с момента сокращения последней карты.
Документация по инкрементным операциям mapReduce находится здесь: http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce
Интеграция новых результатов со старыми объясняется в разделе «Параметры вывода».
Я понимаю,что мой совет до сих пор был довольно общим, поэтому я попытаюсь ответить на ваши вопросы сейчас:
1) Как обсуждалось выше, если ваша операция MapReduce должна читать каждый отдельный документ, это не будет хорошо масштабироваться.
2) Операция MapReduce выводит только коллекцию.Создание индекса и запрос этой коллекции должны быть выполнены программно.3) Если существует один процесс, который запрашивает коллекцию в то же время, что другой обновляет ее, тогда запрос может вернуть документ до его обновления.Короткий ответ: «да» 4) Если коллекция отброшена, то индексы придется перестраивать.Если документы в коллекции удаляются, но сама коллекция не удаляется, то индексы сохраняются.В случае запуска MapReduce с параметром {out: {replace: "output"}} индекс (ex) будет сохраняться и его не нужно будет создавать заново.
5) Как указано выше, если возможнобыло бы предпочтительнее добавить другое поле в вашу коллекцию "posts" и обновить его, вместо того чтобы выполнять так много операций MapReduce.
Надеюсь, я смог предоставить вам некоторые дополнительные факторы, которые следует учитывать при создании приложения.В конечном счете, важно помнить, что каждое приложение уникально, и поэтому для окончательного доказательства того, какой путь «лучший», вам придется поэкспериментировать со всеми различными вариантами и решить для себя, какой способ наиболее эффективен.Удачи!