Найти самые последние и ближайшие записи, не более 20

#mongodb #sorting #geospatial

#mongodb #сортировка #геопространственный

Вопрос:

Допустим, у меня есть куча записей (для ленты, например, в Facebook / Twitter / foursquare) в MongoDB, и у каждой записи есть местоположение и временная метка.

Каков наилучший способ получить самые последние и ближайшие сообщения, не более 20 сообщений?

Это тоже субъективный вопрос. Допустим, что вы можете указать $maxDistance и максимальное время с этого момента (я не уверен, как бы вы это сделали иначе.). Как бы вы их указали? Вы бы отсортировали по самым последним или ближайшим, сохранили бы это случайным образом или отсортировали каким-либо другим способом? Какой алгоритм сортировки, по-вашему, наиболее интересен?

Комментарии:

1. Не могли бы вы привести примеры запросов, которые не работают? Это сэкономило бы некоторое время на исследование для тех, кто должен ответить.

Ответ №1:

Я полагаю, что в конечном итоге вы получите список сообщений, которые имеют два отдельных измерения ранжирования, т.Е.:

 { age: 86400, distance: 1000 }
{ age: 172800, distance: 5000 }
{ age: 57600, distance: 20000 }
{ age: 288000, distance: 8000 }
  

На самом деле не имеет значения, какие единицы измерения, скажем, секунды и метры. Если вы хотите, чтобы оба влияли на ранг сортировки, то в итоге вы получите алгоритм ранжирования, в самом простом виде что-то вроде этого:

 rank = (C1 * age)   (C2 * distance)
  

Где C1 и C2 являются константами, которые вы можете настроить для настройки весов. Значения будут зависеть от того, какие единицы измерения вы используете и какое влияние на ранжирование вы назначаете каждому измерению.

Другим вариантом может быть упорядочивание сначала по временной совокупности, затем по расстоянию, так что все записи с сегодняшнего дня упорядочены по расстоянию; затем следуют вчерашние, упорядоченные по расстоянию, и так далее. Или наоборот, упорядочить по диапазону расстояний, затем по возрасту, чтобы все в пределах (0-1000 м) были упорядочены по возрасту; затем следуют все в пределах (1001-2000 м) и так далее.

Комментарии:

1. Пожалуйста, включите примеры запросов MongoDB, написанных на JavaScript.

2. Вы знаете что. Вы правы. Я не должен был голосовать за вас. Я был просто разочарован, потому что ваше решение не объясняет, как запрашивать MongoDB, используя первый алгоритм ранжирования, который вы предлагаете. Кроме того, age amp; distance не могут быть сохранены в каждой записи, потому что они переменные. created_time amp; location можно сохранить, но тогда как бы вы запрашивали MongoDB, сортируя по rank ? Если вы отредактируете свой пост, чтобы добавить запрос MongoDB, который сортирует по рангу, я смогу проголосовать за вас (сейчас он заблокирован.), и я бы рассмотрел возможность присуждения вам бонусных баллов 50.