3-колоночный запрос в DynamoDB с использованием DynamooseJs - PullRequest
0 голосов
/ 07 октября 2018

Моя таблица - (device, type, value, timestamp), где (device,type,timestamp) создает уникальную комбинацию (кандидат на составной ключ в СУБД DynamoDB).

Мои запросы могут находиться в диапазоне между любым из этих трех атрибутов, например:

GET (value) с (device) с (type), имеющим (timestamp) больше, чем <<code>some-timestamp>

Я использую dynamoosejs / dynamoose .И из большинства поисков, я полагаю, я должен использовать комбинацию трех полей (как одно поле; device-type-timestamp) как id.Однако set: function из Schema не позволяет мне использовать свойства объекта (например, this.device), и по некоторым причинам я не могу сделать это извне.

Ближайшее, что я получил (* 1023)*)

и

(id:uuidv4:rangeKey, device:string:hashKey, type:string:LocalSecIndex, timestamp:Date:LocalSecIndex)

и т. Д.

Однако при использовании запроса становится трудно получить результатыв частности device,type как id, (hashKey или rangeKey) постоянно отсутствует на сцене.

Так что вопрос.Как бы вы сделали это для такой таблицы?

И, что следует отметить, эта таблица предназначена для сбора контента с устройств IoT, который генерируется в среднем каждые 5 минут каждым устройством.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Учитывая мнение @ charlie-fish, я решил перейти к Dynamoose и импровизировать код, чтобы передать модель функции set атрибута.Однако я обнаружил, что model уже передается параметру default атрибута.Поэтому я изменил свой Schema на следующий:

  id:hashKey;default: function(model){ return model.device + "" + model.type; }
  timestamp:rangeKey

Для всех, кто здесь ответит на этот ответ, обратите внимание, что функции default & set могут обращаться к параметрам атрибута и экземпляру схемы, используя thisОднако обе эти функции должны быть обычными функциями, а не функциями стрелок.

Сохранение этого здесь в качестве ответа, но я не буду принимать его как ответ на свой вопрос в течение некоторого времени, так как я хочу кого-то ждатьеще ударить лучший подход.Я также хочу убедиться, что если значение передано для поля id, оно не должно быть установлено.Для этого я могу использовать set, чтобы игнорировать фактическое входящее значение, которое я пока не знаю, как.

0 голосов
/ 08 октября 2018

Мне любопытно, почему вы выбираете DynamoDB для этой задачи.Такие сложные запросы, кажется, гораздо лучше подходят для баз данных на основе SQL, чем для баз данных NoSQL.Из-за продвинутой природы запросов SQL эта задача, по моему опыту, намного проще в базах данных SQL.Поэтому я бы посоветовал вам подумать о том, является ли DynamoDB действительно подходящей системой для того, что вы пытаетесь сделать здесь.

Если вы решите, что это так, вам, возможно, придется немного реструктурировать свои данные.Вы можете сделать что-то вроде свойства device-type, которое будет объединять значения устройства и типа.Затем установите его в качестве индекса и выполните запрос на основе этого, отсортируйте по отметке времени и отфильтруйте результаты, которые не превышают желаемое значение.

Вы правы, что в настоящее время Dynamoose не передаетвесь объект в функцию set.Это то, что лично я открыта для изучения.Я являюсь участником проекта GitHub, и если вы хотите представить PR, добавляющий эту функцию, я был бы очень рад помочь вам изучить этот вариант и включить его в кодовую базу.

Другойвы, возможно, захотите исследовать наличие потока DynamoDB, который будет устанавливать это свойство device-type всякий раз, когда оно добавляется в вашу таблицу DynamoDB.Это отвлечет эту логику от DynamoDB и вашего приложения.Я не уверен, если это необходимо для того, что вы делаете, чтобы развязать его до этого уровня, но это может быть то, что вы хотите исследовать.

Наконец, в зависимости от ваших настроек, вы можете выяснить, какой элемент будетбыть более уникальным device или type и установить индекс для этого свойства.Затем просто сделайте запрос на основе этого и отфильтруйте результаты другого свойства, которое вам не нужно.Я не уверен, что это то, что вы ищете, это, конечно, сработает, но я не уверен, сколько элементов у вас будет в вашей таблице, и возникнут вопросы о масштабируемости на определенном уровне.Одним из способов решения некоторых из этих вопросов о масштабируемости может быть установка TTL ваших элементов, если вы знаете, что указанная вами временная метка является постоянной или предсказуемой заранее.

В целом, существуетмного способов достичь того, что вы хотите сделать.Без более подробной информации о количестве элементов, о том, что именно эти свойства будут выполнять, о необходимой вам масштабируемости, какие из этих свойств будут наиболее уникальными и т. Д., Трудно найти хорошее решение.Я настоятельно рекомендую вам подумать, действительно ли NoSQL - лучший путь.Тот запрос, который вы хотите сделать, кажется НАМНОГО больше похож на запрос SQL.Не говоря уже о том, что это невозможно в DynamoDB, но это потребует некоторых размышлений о том, как вы хотите структурировать свою модель данных, и тому подобное.

...