2016-12-12 6 views
0

Я рефинансирую бэкэнд приложения Node/Express от MongoDB до Redis.Сложные структуры данных в Redis

Мои данные в настоящее время состоят из нескольких десятков (~ 70) документов, каждый из которых состоит из NAME, аббревиатуры ABBR, местоположения GeoJSON и массива целочисленных ПАРАМЕТРОВ. ПАРАМЕТРЫ для каждого документа обновляются каждые несколько минут, но остальные атрибуты остаются фиксированными. Длина атрибута PARAMETER может отличаться (и может также быть пустым). Я хотел бы выполнить множество запросов по данным для проверки ближайших местоположений в заданной точке и отобразить имя, аббревиатуру и параметры.

Пример документа:

{ 
    _id: ObjectId("1"), 
    name: 'A place', 
    abbr: 'PLC', 
    location: { type: "Point", coordinates: [ -130.922, 33.289 ]}, 
    parameters: [3 4 28], 
} 

Я знаком с командой GEOADD в Redis, но я не вижу, как использовать его, чтобы создать более сложную структуру данных для хранения своих данных, учитывая, что, если я используйте команду GEOADD для указания местоположения, а затем попытайтесь использовать HMSET для добавления полей для имени и аббревиатуры, я получаю ошибку WRONGTYPE.

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

1 name 'A Place' abbr 'PLC' location -130.922 33.289 parameters 3 4 28 

Или, если не совсем, что способ легко запросить близость места в моем наборе вместе с другими атрибутами.

ответ

2

Структуры данных ядра Redis не могут быть вложенными. В вашем примере вы должны использовать разные разные ключи (и структуру данных) для каждого уровня, например. хеш для свойств, геосеть для местоположения и, возможно, еще один хэш для параметров.

Как только у вас есть это, ваш запрос должен состоять из трех чтений для составления окончательного ответа.

+0

практический подход состоял в том, чтобы сохранить местоположение в виде строки «-130.922,33.289» в хэш-ключе и добавить идентификатор к геосети с помощью GEOADD, поэтому он будет служить индексом. –

 Смежные вопросы

  • Нет связанных вопросов^_^