2016-03-01 49 views
8

我想在DynamoDB中'插入'文档。也就是说,我想指定一个键和一组字段/值对。如果没有文档存在与该键,我不会用该键和我指定的键/值对创建一个。如果文档与该键一起存在,我希望我指定的字段被设置为指定的值(如果这些字段以前不存在,则应该添加它们)。现有文档中的任何其他未指定的字段都应单独保留。是否可以在DynamoDB中插入嵌套字段?

看来我可以用UpdateItem调用来做到这一点,当我设置的字段/值对都是顶级字段时。如果我有嵌套结构,只要结构存在,UpdateItem就可以设置嵌套字段。换句话说,如果我现有的文档有"foo": {},那么我可以成功设置"foo.bar": 42

不过,我似乎不能够设置"foo.bar": 42如果没有foo对象已(如在没有与指定字段没有文件在所有的情况下,和我的“UPSERT”被表现为一个'insert'。

我在几年前的AWS论坛上发现了a discussion,这似乎暗示我想做的事情无法完成,但我希望最近这个改变了,或者有人知道怎么办?

+1

再给你一个数据点,我看着这在2015年5月(ISH)和你提到的同样的问题仍然存在。我无法实现嵌套字段upsert的目标,所以我不得不改变我的方法来解决问题以及我如何存储数据。 – mkobit

+0

@mkobit感谢您的数据点;这也是我得出的结论。由于我的数据具有固定数量的嵌套层次,因此我最终将其平铺存储,并将字段命名为'foo_bar',并且将编组/解组代码添加到我的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