Как реализовать количество просмотров конкретной страницы

Итак, в основном я хочу реализовать ту же функциональность, что и stackoverflow:

viewed 59344 times

Итак, вот некоторая справочная информация:

  • Я хочу считать только уникальные посещения. Предположение, что зарегистрированные пользователи будут читать статью много раз (она развивается)
  • Я использую MongoDB как магазин
  • Я хотел бы, чтобы он был близок к реальному времени.
  • Моя система будет иметь регистрацию, но я также хочу подсчитать мнения анонимных пользователей

Я понимаю, что лучший способ подсчета уникальных посещений - это регистрация, но дело в том, что большой кусок пользователей будет просто пассивными читателями, которым не нужно создавать учетную запись для чтения информации из приложения. Насколько я понимаю, наиболее удобным способом является сохранение IP-адреса каждого пользователя, который прочитал сообщение. Я также понимаю, что IP-адрес не обеспечит уникальность (у некоторых разных пользователей будет один и тот же IP-адрес, потому что они находятся за одним и тем же интернет-провайдером, а один пользователь может иметь разные IP-адреса, используя прокси-серверы и т.д.)

Использование Монго не является абсолютно необходимым, просто дело в том, что сейчас все написано в Монго, поэтому я переключаюсь, только если это будет намного быстрее/удобно.

Ответ 1

Фон

Вы определенные, вам нужно отслеживать "уникальные" представления?

На самом деле я бы не ожидал, что популярные сайты попытаются сохранить уникальные подсчеты просмотров - больше, и лучше повторить посещения новых комментариев, по-прежнему являются дополнительными "представлениями" в смысле отображения нового контента/комментариев/рекламы. Существуют и другие возможные тонкости "правильности", которые могут или не могут быть важны для вашего случая использования, такие как исключение сканеров или ваших собственных пользователей/IP-адресов компаний.

Вместо того, чтобы тратить время на отслеживание уникальных просмотров (что не слишком значимо), я бы посмотрел на подсчет уникальных пользовательских взаимодействий, таких как голосование/симпатия/комментирование на странице. Затем вы можете определить "популярность" страницы с некоторой формулой, основанной на этих показателях. Существует интересный пример этого подхода в Модуль радиоактивности для Drupal, где рассчитывается метрика "горячность" на основе активности, основанной на повторяемости пользователя взаимодействий.

Подходы к рассмотрению

1) Для простого счетчика просмотров в MongoDB я бы просто использовал $inc, чтобы увеличить количество просмотров при загрузке страницы, Вы можете исключить пользователей журналов по ролям по мере необходимости (например, пользователи-администраторы).

2) Для более точного счетчика просмотров я бы отказался от проблемы на платформе web analytics (которую вы должны использовать с вашим сайтом для более детального анализа в любом случае). Например, вы можете использовать API Google Analytics или приложение с открытым исходным кодом, например Piwik. У систем веб-аналитики уже есть решения для определения уникальных пользователей/представлений, и API-запросы для них могут быть асинхронными с помощью JavaScript.

3) Если вы используете свое собственное уникальное представление, отслеживающее определенное требование, я бы использовал отдельную коллекцию для отслеживания просмотров и upsert на основе ваши уникальные критерии (уникальный вид для пары user,article для зарегистрированных пользователей или пара session_id,article для анонимных пользователей). Я бы объединил это с подходом № 1 (увеличивая счетчик просмотров для представлений статьи), увеличивая счетчик представлений статьи, если upsert приводит к вставке.

Ответ 2

Один из способов решить проблему - использовать куки файлы, как только пользователь посетил страницу, вы можете добавить один добавленный файл cookie, указав, что он уже посетил страницу, и вам не нужно снова его пересчитывать. Вы можете продолжать добавлять некоторые ключи, чтобы знать, какие страницы он посетил. Я знаю, что файлы cookie можно удалить, но в любом решении будет компромисс.

Из перспективы mongoDB, если вы хотите очень быстро вставить и прочитать, я бы предложил пару вещей, которые вы можете сделать.

1) Когда вы создаете статью, создайте такой документ в своей коллекции журнала

   {"_id" : "Article URL" , {"Hit" : 0}} 

Почему я не предлагаю добавлять IP-адрес или любую другую информацию, потому что, поскольку вы будете добавлять IP-адреса, размер документа, который будет изменен, должен найти новое выделенное пространство. Что плохого от угла зрения. Поскольку вы только увеличиваете счетчик, он не увеличит размер документа, и его не нужно будет менять. + У вас есть ограничение на максимальный размер документа, который у вас есть.

2) Создание документа заблаговременно даст прямой оператор обновления и не стоит беспокоиться о наличии документа для идентификатора статьи или нет.