当前位置: 首页 > 面试题库 >

在AWS dynamoDB中更新JSON数组

颜欣怡
2023-03-14
问题内容

我的文档如下所示:

{
  "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的两次调用,这似乎效率很低。

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


问题答案:

我找不到查询和更新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。即使这是多余的步骤,我也不想在业余爱好项目上花费额外的钱。



 类似资料:
  • JSON文件:[ { “名称”:“约翰”,“城市”:“柏林”,“工作”:“教师”},{ “名称”:“马克”,“城市”:“奥斯陆”,“工作”:“医生”}] JSONParser parser=新的JSONParser();JSONArray a=(JSONArray)parser.parse(新的FileReader(“f:\file.json”));

  • 这就是状态变量中的内容 我试图做的是调用一个函数来更新一个位置的期望值。例如,我使用的函数如下: 它不起作用。我知道我可以传递一个完全更新的数组,但我需要当前状态的其他值。

  • 我有以下不便之处,我想只使用PostgreSQL更新JSON数组的键。我有以下json: 如果“othern”=X,我需要将“othern”更新为另一个数字 (X是我传递给查询的任何数字。例如,如果othern=5,则更新othern)。 这个JSON可能要大得多,所以我需要一些可以在JSON数组中迭代的东西,找到所有与X数匹配的“othern”,并替换为新的。非常感谢。 我尝试了Postgres

  • 接口说明 操作场景产生的信息json,需要提交到服务端进行保存,以便下次查看场景的时候,可以正常访问到对该场景操作过得信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/scene/1.0.0/upload 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 场景ID

  • 问题内容: 我想更新一个数组值,但我不确定要执行的正确方法,因此我尝试了以下方法,但没有为我工作。 我的模型,我模型中的子域 我的查询 谁能给我帮助。谢谢。 问题答案: 你不能同时使用 ,并 在相同的更新表达式作为嵌套的运营商。 使用更新运算符的正确语法如下: 在那里可以来自任何指定的更新列表运营商的位置。 要将一个新元素添加到数组中,只需一个 运算符即可,例如,您可以使用 update方法将修改

  • 我有一个highlight模式为: