2016-03-01 4 views
8

Я хотел бы «обновить» документ в DynamoDB. То есть, я хотел бы указать ключ и набор пар полей/значений. Если с этим ключом не существует документа, я бы не создал его с указанным ключом/парами значений/значений. Если документ существует с этим ключом, я хочу, чтобы указанные мной поля были установлены на указанные значения (если эти поля ранее не существовали, то они должны быть добавлены). Любые другие неопределенные поля в существующем документе должны быть оставлены в покое.Возможно ли воссоздать вложенные поля в DynamoDB?

Похоже, что я могу сделать это довольно хорошо с вызовом UpdateItem, когда полями/значениями, которые я устанавливаю, являются все поля верхнего уровня. Если у меня есть вложенные структуры, то UpdateItem будет работать, чтобы установить вложенные поля, если структура существует. Другими словами, если мой существующий документ имеет "foo": {}, то я могу установить "foo.bar": 42 успешно.

Однако, похоже, я не могу установить "foo.bar": 42, если объект foo отсутствует (как в случае, когда документ с указанным полем вообще отсутствует, и мой «upsert» ведет себя как «вставить».

Я нашел a discussion на форумах AWS несколько лет назад, что, похоже, подразумевает, что то, что я хочу сделать, не может быть сделано, но я надеюсь, что это изменилось недавно, или, может быть, кто-то знает о способ сделать это?

+1

Чтобы дать вам еще один Datapoint, я посмотрел в это в мае 2015 года (иш), и та же проблема, о которой вы говорили, все еще существует. Я не смог достичь цели вложенного поля, поэтому мне пришлось изменить свой подход к проблеме и как я сохранил данные. – mkobit

+0

@mkobit спасибо за вашу точку данных; это и заключение, к которому я пришел. Поскольку у моих данных было фиксированное количество вложенных уровней, я закончил тем, что сохранил его сплюснутым, с полями, называемыми 'foo_bar', и я добавил маршаллинг/unmarshalling код на мой уровень DAO для его перевода. Это боль, но, похоже, она работает достаточно хорошо (по крайней мере) – pkaeding

+2

Тот же выпуск через год. Досадной частью является то, что Dynamo не выдает ошибку, она просто не сохраняет эту часть дерева данных. – Jelling

ответ

0

UpdateItem ведет себя как операция «upsert»: элемент обновляется, если он существует в таблице , но если нет, добавляется новый элемент (вставлен). http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

+2

Да, я это читал. Но если вы прочитаете мой вопрос, я не могу взламывать вложенные объекты. – pkaeding

+0

Я использовал его с вложенными объектами, и он работал (с DynamoDBMapper). http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html – Neil

0

Это ("foo.bar": 42) может быть достигнут с помощью ниже запроса:

table.update_item(Key = {'Id' : id}, 
       UpdateExpression = 'SET foo = :value1', 
       ExpressionAttributeValues = {':value1': {'bar' : 42}} 
      ) 

Надеется, что это помогает :)

+0

, но если начальное значение 'foo' имело другие ключи, в дополнение к' значение бара, которое вы обновляете, разве они не будут потеряны? Например, если начальное значение было '{foo: {biz: 33, bar: 0}}' и вы хотите изменить только 'foo.bar', оставив остальную часть объекта' foo' без изменений, будет ли это работать? – pkaeding

+0

Я ответил на вопрос, похожий на этот вопрос. https://stackoverflow.com/questions/35569733/how-to-adding-an-empty-or-data-map-in-dynamodb/46791740#46791740 Пожалуйста, проверьте и прокомментируйте это, если это работает. – manojpt