在 AWS dynamoDB 中更新 JSON 数组

Lak*_*kar 5 arrays json amazon-web-services amazon-dynamodb dynamo-local

我的文档是这样的:

{
  "data": {
      "eventId": "20161029125458-df-d",
      "name": "first",
      "purpose": "test",
      "location": "yokohama",
      "dateArray": [],
      "attendees": [
        {
          "attendeeId": "2016102973634-df",
          "attendeeName": "lakshman",
          "personalizedDateSelection": {}
        },
        {
          "attendeeId": "2016102973634-tyyu",
          "attendeeName": "diwaakar",
          "personalizedDateSelection": {}
        }
      ]
    }
}
Run Code Online (Sandbox Code Playgroud)

比如说,我需要使用attendeeId: 2016102973634-df更新参与者JSON 数组。我尝试了很多使用update 和 condition expression 的方法,但没有成功。

这是我的尝试:

const params = {
  TableName: "event",
  Key: {
    "eventId": eventId 
  },
  UpdateExpression: "SET attendees[???] = ",
  ConditionExpression: attendees.attendeeId = "2016102973634-df", 
  ExpressionAttributeValues: {
    ":attendee" : attendeeList
  },
  ReturnValues: "ALL_NEW"
};


dynamo.update(params, (err, data) => {
  if (err) {
    return reject(err);
  }
  console.log(data.Attributes);
});
Run Code Online (Sandbox Code Playgroud)

找不到用于更新数组中的 Json 的任何资源。

在@notionquest 的评论之后: - 没有使用任何 JsonMarshaller。最初我将空数组添加到与会者字段,如下所示:

{
  "eventId": "20161029125458-df-d",
  "name": "first",
  "purpose": "test",
  "location": "yokohama",
  "dateArray": [],
  "attendees": []
}
Run Code Online (Sandbox Code Playgroud)

然后当新的与会者到来时,我将其添加到与会者属性中,如下所示:

const attendee = {
  "attendeeName": "user1",
  "personalizedDateSelection": {"today": "free"}
}
const attendeeList = [attendee];
const eventId = "20161029125458-df-d";


const params = {
  TableName: "event",
  Key: {
    "eventId": eventId
  },
  UpdateExpression: "SET attendees = list_append(attendees, :attendee)",
  ExpressionAttributeValues: {
    ":attendee" : attendeeList
  },
  ReturnValues: "ALL_NEW"
};


dynamo.update(params, (err, data) => {
  if (err) {
    return reject(err);
  }
  console.log("in update dynamo");
  console.log(data.Attributes);
});
Run Code Online (Sandbox Code Playgroud)

正如您在上面的代码片段中看到的,最初我添加了空的[] 数组使用上面的代码添加了一个新的参与者。现在,如何更新数组中的特定 JSON。如果你说那不可能,我还能尝试什么?

我应该试试这个:

  1. 获取完整的 JSON。
  2. 操纵 JSOn 并在我的 nodeJS 中更改我想要的东西。
  3. 然后将新的 JSON 更新为 dynamoDB。
  4. 但这会消耗两次对 dynamoDB 的调用,这似乎效率低下。

想知道有没有圆路?

Lak*_*kar 1

我找不到任何查询和更新 JSON 数组的答案。我认为这可能是 AWS 不允许这些功能的盈利动机。如果需要查询主键以外的特定ID,则需要创建二级索引,这样比较经济。此二级索引成本是 dyn amoDB 表成本之外的额外成本。

因为,我不想在二级索引上支付额外的费用,所以我将 dynamoDB 架构更改为以下内容:

{
  "data": {
      "eventId": "20161029125458-df-d",
      "name": "first",
      "purpose": "test",
      "location": "yokohama",
      "dateArray": [],
      "attendees": {
        "2016102973634-df": {
          "attendeeId": "2016102973634-df",
          "attendeeName": "lakshman",
          "personalizedDateSelection": {}
        },
        "2016102973777-df": {
          "attendeeId": "2016102973777-df",
          "attendeeName": "ffff",
          "personalizedDateSelection": {}
        }
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

将与会者从[]更改为{}。这使我能够灵活地查询特定attendeeId并更改与之关联的整个 JSON。尽管这是一个多余的步骤,但我不想在我的爱好项目上花费额外的钱。

  • 您能否发布示例查询来更新嵌套 json?如何更新“attendees.2016102973634-df”json?以及如何更新“attendees.2016102973634-df.attendeeName”? (7认同)