一尘不染

在AWS dynamoDB中更新JSON数组

json

我的文档如下所示:

{
  "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": {}
        }
      ]
    }
}

说,我需要使用 与会者ID:2016102973634-df 更新与会者JSON数组。我尝试了使用 更新和条件表达式的
多种方法,但均未成功。

这是我的尝试:

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);
});

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

@notionquest发表评论后:-尚未使用任何JsonMarshaller。最初,我将空数组添加到与会者字段,如下所示:

{
  "eventId": "20161029125458-df-d",
  "name": "first",
  "purpose": "test",
  "location": "yokohama",
  "dateArray": [],
  "attendees": []
}

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

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);
});

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

我应该试试这个吗?

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

想知道是否有任何通行的途径?


阅读 255

收藏
2020-07-27

共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": {}
        }
      }
    }
}

将参加者从 [] 更改为 {} 。这使我可以灵活地查询特定的 与会者ID
并更改与此关联的整个JSON。即使这是多余的步骤,我也不想在业余爱好项目上花费额外的钱。

2020-07-27