2016-08-25 3 views
2

требования высокого уровня:Удалить первые несколько записей из списка dynamoDB типа данных

  • Там могут быть миллионы пользователей
  • Любой пользователь может любимец нуждается другой пользователь
  • данные отслеживания местоположения пользователя будет храниться. Необходимо сохранить максимум 100 последних точек данных.

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

{ 
    "userID" : 2323423, 
    "favs" : [ 
      userIDA, 
      userIDB, 
      ... 
    ], 
    "lt" : [ 
      {"timestamp1" : "coordinate1"}, 
      {"timestamp2" : "coordinate2"}, 
      ... 
     ] 
} 

ID пользователя является основным ключом.

требования запроса являются

  1. Добавление удаление избранных должно быть возможным.
  2. Буква новой отметки времени < => Могут появиться пары местоположений GPS, которые мне нужно передать в данные этого «lt» пользователя. Поскольку существует предел в 100 пунктов данных LT, мне нужно также удалить самые старые.

Я уверен, что (1) прямолинейно используется с помощью API добавления/удаления в виде списка. Как решить запрос (2)? Было бы лучше, если бы сам запрос UPDATE каким-то образом мог перебирать все объекты и удалять старые. Я читал, что индексы в списке, понимаемые в базе данных Dynamo DB, находятся в целочисленном формате, так что мы можем каким-то образом использовать это? Являются ли элементы в списке всегда индексированными от 0 до N? Если это так, я могу удалить соответствующее количество элементов из начала массива. Есть ли способ сделать это?

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

ответ

4

1) Атрибут «favs» должен быть определен как тип данных SET, чтобы использовать функцию DELETE. Обратите внимание, что вы не можете использовать DELETE для типа данных LIST.

Оператор Delete может использоваться только в SET.

DELETE - Удаляет элемент из набора.

Если задан набор значений, то эти значения вычитаются из старого набора. Например, если значением атрибута было множество [a, b, c] , а действие DELETE указывает [a, c], то окончательное значение атрибута - [b]. Указание пустого набора является ошибкой.

Действие DELETE поддерживает только заданные типы данных. Кроме того, DELETE может использоваться только для атрибутов верхнего уровня, а не для вложенных атрибутов.

2) Чтобы удалить возникновение (т. Е. Объект) из типа данных LIST, вы должны знать индекс.Выражение обновление может быть что-то, как показано ниже: -

UpdateExpression: "REMOVE л [0]" - Удалить один элемент

UpdateExpression: "REMOVE л [0] л [1]" - Удалить элементы 0 и 1

Да, индекс начинается с 0 по N для типа данных LIST.

3) Устранение элемента - Да, вы можете включить условия в ConditionExpression. Однако REMOVE требует индекса для элемента списка. В противном случае он удалит весь список (т. Е. Не определенный индекс из списка).

Кроме того, если вы хотите ссылаться на объект MAP внутри списка, вам нужен индекс списка.

Пример: для удаления media.id = 3, условные выражения и обновления должны быть, как указано ниже: -

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

синтаксис JavaScript для удаления "media.id" = 3: -

var params = { 
     TableName : "Product", 
     Key : { 
      "product" : "IPhone 7+" 
     }, 
     UpdateExpression : "REMOVE media[2]", 
     ConditionExpression: "media[2].id = :idvalue",  
     ExpressionAttributeValues: {":idvalue" : "3", 
     }, 
     ReturnValues : "UPDATED_NEW" 
    }; 

данные: -

"media": { 
      "L": [{ 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/a.jpg" 
        }, 
        "type": { 
         "S": "image" 
        }, 
        "id": { 
         "S": "1" 
        } 
       } 
      }, { 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/b.jpg" 
        }, 
        "type": { 
         "S": "image" 
        }, 
        "id": { 
         "S": "2" 
        } 
       } 
      }, { 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/overvie 
         w.mp4 " 
        }, 
        "type": { 
         "S": "video" 
        }, 
        "id": { 
         "S": "3" 
        } 
       } 
      }] 
     } 
+0

Благодаря @notionquest. Еще один запрос: можно ли удалить старые записи из списка «lt», если каждая из записей внутри него - это карта с ключом пара значений временной метки и координат? { «метка»: 23423432434, «коорд»: «2,34435, 0,3342343» } Таким образом, путем сканирования таблицы, удаление этих записей списка внутри «ЛТ», где метка старше некоторого значения? – Ouroboros

+0

это определенно помогает. Не могли бы вы сообщить мне, возможно ли добавлять элементы в список без условного выражения и удалять устаревшие записи внутри, используя список условных выражений за один раз? Я не боюсь, просто хотел подтвердить. Я не хочу писать пиктограмму cron, которая выполняет сканирование и удаляет записи, которые являются устаревшими (это не слишком много). Я в порядке, сохраняя 100 точек данных или около того для отслеживания местоположения. Надеюсь, ты сможешь помочь. – Ouroboros

+0

просто для добавления в мой предыдущий комментарий, я могу запустить запрос, чтобы добавить другую запись координат в список отслеживания местоположений «lt». Есть ли способ, с помощью которого я могу удалить все записи в списке, соответствующем условному выражению? Это нормально, если я должен запустить этот запрос отдельно. Моя мотивация заключается в удалении устаревших записей списка «lt», чья временная метка устарела (более двух дней) или что-то в этом роде. – Ouroboros

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