Удалить первые несколько записей из списка dynamoDB тип данных
Требования высокого уровня:
- там могут быть миллионы пользователей
- любой пользователь может полюбить другого пользователя
- данные отслеживания местоположения пользователя должны быть сохранены. Необходимо сохранить максимум 100 самых последних точек данных.
Я думаю использовать Dynamo DB для достижения этой цели, сохраняя данные в следующем формате (мотивация использования NOSQL заключается в том, что извлечение будет быстрым, так как в одном get я получу все данные):
{
"userID" : 2323423,
"favs" : [
userIDA,
userIDB,
...
],
"lt" : [
{"timestamp1" : "coordinate1"},
{"timestamp2" : "coordinate2"},
...
]
}
UserID является основным ключ.
Требования к запросу
- Добавление удаления избранных должно быть возможно.
- может появиться куча новых пар временных меток GPS-координат, которые мне нужно ввести в данные " lt " этого пользователя. Поскольку существует ограничение в 100 ЛТ точек данных, мне нужно удалить и самые старые.
Я почти уверен, что (1) прямо использует API add/remove для типа данных List.
Как решить запрос (2)? Было бы лучше, если бы сам запрос обновления каким-то образом можно было перебирать все объекты и удалять старые. Я читал, что индексы в списке, как их понимает Dynamo DB, имеют целочисленный формат, так что можем ли мы как-то использовать это? Всегда ли элементы в списке индексируются от 0 до N? Если это так, я могу удалить соответствующее количество элементов из начала массива. Есть ли какой-нибудь способ сделать это?
Я готов использовать другую схему данных, но, пожалуйста, дайте мне знать все рассуждения и как это может быть разрешенный.
1 ответ:
1) атрибут "favs" должен быть определен как тип данных SET, чтобы использовать функцию DELETE. Обратите внимание, что вы не можете использовать тип данных DELETE on LIST.
Оператор Delete может использоваться только на множестве.
DELETE-удаление элемента из набора.
Если задан набор значений, то эти значения вычитаются из старый набор. Например, если значение атрибута было задано [a, b, c] и действие DELETE указывает [a, c], то конечный атрибут значение есть [b]. Указание пустого набора является ошибкой.
Действие удалить поддерживает только заданные типы данных. Кроме того, удалить может использоваться только для атрибутов верхнего уровня, но не для вложенных атрибутов.
2) чтобы удалить вхождение (т. е. объект) из типа данных списка, вы должны знать индекс. Выражение обновления может быть примерно следующим: -
UpdateExpression : "REMOVE lt[0]" - удалить один элемент
UpdateExpression: "удалить lt[0] lt[1]" - Удалить элементы 0 и 1
Да, индекс начинается от 0 до N для типа данных списка.
3) условное удаление элемента-да, вы можете включить условия в ConditionExpression. Однако для удаления элемента списка требуется индекс. В противном случае он удалит весь список (т. е. не конкретный индекс из списка).
Кроме того, когда вы хотите сослаться на объект карты внутри списка, вам нужен индекс списка.
Пример: Чтобы удалить media. id=3, условные и обновляющие выражения должны быть такими, как указано ниже: -
Обратите внимание, что индекс используется как в условных выражениях, так и в выражениях обновления.Синтаксис JavaScript, чтобы удалить "медиа.идентификатор" = 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" } } }] }
Comments