在不知道ID

时间:2018-04-17 10:01:48

标签: node.js amazon-web-services amazon-dynamodb

Reading through the docs,AWS似乎想象您以某种方式知道要更新的地图的索引编号。这很奇怪,因为他们甚至不使用他们界面中的数字。

我有这个对象:

let zoo = {
  camels: 562
}

我想将它添加到我的项目中:

{
  Key: { id: id },
  TableName: tableName,
  UpdateExpression:
    'SET #z = :z',
  ExpressionAttributeNames: {
    '#z': 'zoo'
  },
  ExpressionAttributeValues: {
    ':z': zoo
  }
}

到目前为止一切顺利。现在我已经获得了一个新项目以附加到列表中。它可能不止一个:

let zoo = {
  elephants: 126,
  tigers: 89
}

然后我的目标是让我的zoo地图看起来像这样:

{
  camels: 562,
  elephants: 126,
  tigers: 89
}

但是,我无法弄清楚如何在没有ID的情况下附加到地图。

我看到有人使用这个:

'SET #z = #z + :z'

但这根本不起作用(Incorrect operand type for operator or function; operator or function: +, operand type: M)。

AWS的文档建议我可以这样做:

'SET #z.#animal = :animal'

然后我可以遍历我的对象并生成一个可以工作的SET字符串。但是,这只是我正在尝试做的一个基本的例子。我希望能够添加这样的东西:

let zoo = {
  aquatics: {
    penguins: 988,
    tropical_fish: 1943
  },
  mammals: {
    elephants: 126,
    tigers: 89 
  }
}

我当然可以首先获取该项目,在JavaScript中合并地图,然后再将其发回 - 但我正在努力避免发出读/写请求。

1 个答案:

答案 0 :(得分:1)

你能使用ADD吗?

{
  Key: { id: id },
  TableName: tableName,
  UpdateExpression:
    'ADD #z = :z',
  ExpressionAttributeNames: {
    '#z': 'zoo'
  },
  ExpressionAttributeValues: {
    ":z": "L": ["M": {"Elephants": {"N": 126}}]
  }
}
  

如果属性是一个集合,并且您要添加的值也是一个集合,   然后将值附加到现有集合。

我认为这里的关键是你要添加的价值必须是一套。我是否认为你有一张地图清单?在这种情况下,添加包含一个地图的地图列表。