【发布时间】:2017-03-12 01:49:27
【问题描述】:
我的文档如下所示:
{
"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": {}
}
]
}
}
比如说,我需要用 attendeeId: 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": []
}
然后当新的 attendee 出现时,我将其添加到 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);
});
正如您在上面的 sn-ps 中看到的,最初我添加了空的 [] 数组,并使用上面的代码添加了一个新的与会者。现在,如何更新数组中的特定 JSON。如果你说这是不可能的,我还能尝试什么?
我应该试试这个:
- 获取完整的 JSON。
- 操作 JSOn 并在我的 nodeJS 中更改我想要的内容。
- 然后将新的 JSON 更新为 dynamoDB。
- 但这会消耗两次对 dynamoDB 的调用,这似乎是低效的。
想知道是否有任何圆形方式?
【问题讨论】:
-
您是否使用 JsonMarshaller 在 DynamoDB 中将数据保存为 JSON?如果是,则 API 没有更新 JSON 数据的选项。
-
@notionquest 我已经更新了我如何将 Json 插入到数组中的问题。想知道你的想法!!!
标签: arrays json amazon-web-services amazon-dynamodb dynamo-local