更新 AWS dynamoDB 中的 JSON 数组
updating a JSON array in AWS dynamoDB
我的文档是这样的:
{
"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);
});
正如您在上面的代码片段中看到的,最初我添加了空的 [] 数组 并使用上面的代码 添加了一个新的与会者 .现在,如何更新数组中的特定 JSON。如果你说那不可能,我还能尝试什么?
我应该试试这个吗:
- 获取完整的JSON。
- 操纵 JSOn 并在我的 nodeJS 中更改我想要的东西。
- 然后更新新的JSON到dynamoDB。
- 但这会消耗对 dynamoDB 的两次调用,这似乎是低效的。
想知道有没有round way?
我找不到查询和更新 JSON 数组的任何答案。我认为这可能是 AWS profitable 不允许这些功能的动机。如果您需要查询除主键之外的特定 ID,则需要制作一个具有成本效益的二级索引。这个二级索引成本是 dyn 的额外成本
amoDB table 成本。
因为我不想在二级索引上支付额外的费用,所以我将我的 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": {}
}
}
}
}
将与会者从 [] 更改为 {}。这使我可以灵活地查询特定的 attendeeId 并更改与之关联的整个 JSON。尽管这是一个多余的步骤,但我不想在我的爱好项目上花费额外的钱。
您可以存储列表的索引。在更新列表时我们可以使用它们。例如,
{
"data": {
"eventId": "20161029125458-df-d",
"name": "first",
"purpose": "test",
"location": "yokohama",
"dateArray": [],
"attendees": [
{
"index":0,
"attendeeId": "2016102973634-df",
"attendeeName": "lakshman",
"personalizedDateSelection": {}
},
{
"index":1,
"attendeeId": "2016102973634-tyyu",
"attendeeName": "diwaakar",
"personalizedDateSelection": {}
}
]
}
}
const params = {
TableName: "event",
Key: {
"eventId": eventId
},
UpdateExpression: "SET attendees[attendee.index].attendeeName = :value",
ExpressionAttributeValues: {
":value" : {"S":"karthik"}
},
ReturnValues: "ALL_NEW"
};
dynamo.update(params, (err, data) => {
if (err) {
return reject(err);
}
console.log(data.Attributes);
});
更新查询示例:
数据结构(保存在DynamoDB)
{
tenant_id: 'tenant_1',
users: {
user1: {
_id: 'user1',
email_address: 'test_email_1@gmail.com'
},
user2: {
_id: 'user2',
email_address: 'test_email_2@gmail.com'
}
}
}
更新数据(在参数中使用)
var user = {
email_address: 'updated@gmail.com'
}
参数
var params = {
TableName: 'tenant-Master',
Key: {
"tenant_id": 'tenant_1'
},
UpdateExpression: "set #users.user1 = :value",
ExpressionAttributeNames: {
"#users": "users"
},
ExpressionAttributeValues: {
":value": user,
},
};
说明
通过从地图数组切换到地图地图,我们现在可以使用 UpdateExpression: "set #users.user1 = :value"
来更新我们在用户地图上的嵌套对象,其 ID 为 user1
。
注意:此方法将 REPLACE users.user1
处的整个地图对象。如果您想保留 pre-existing 数据,则需要进行一些更改。
我的文档是这样的:
{
"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);
});
正如您在上面的代码片段中看到的,最初我添加了空的 [] 数组 并使用上面的代码 添加了一个新的与会者 .现在,如何更新数组中的特定 JSON。如果你说那不可能,我还能尝试什么?
我应该试试这个吗:
- 获取完整的JSON。
- 操纵 JSOn 并在我的 nodeJS 中更改我想要的东西。
- 然后更新新的JSON到dynamoDB。
- 但这会消耗对 dynamoDB 的两次调用,这似乎是低效的。
想知道有没有round way?
我找不到查询和更新 JSON 数组的任何答案。我认为这可能是 AWS profitable 不允许这些功能的动机。如果您需要查询除主键之外的特定 ID,则需要制作一个具有成本效益的二级索引。这个二级索引成本是 dyn 的额外成本 amoDB table 成本。
因为我不想在二级索引上支付额外的费用,所以我将我的 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": {}
}
}
}
}
将与会者从 [] 更改为 {}。这使我可以灵活地查询特定的 attendeeId 并更改与之关联的整个 JSON。尽管这是一个多余的步骤,但我不想在我的爱好项目上花费额外的钱。
您可以存储列表的索引。在更新列表时我们可以使用它们。例如,
{
"data": {
"eventId": "20161029125458-df-d",
"name": "first",
"purpose": "test",
"location": "yokohama",
"dateArray": [],
"attendees": [
{
"index":0,
"attendeeId": "2016102973634-df",
"attendeeName": "lakshman",
"personalizedDateSelection": {}
},
{
"index":1,
"attendeeId": "2016102973634-tyyu",
"attendeeName": "diwaakar",
"personalizedDateSelection": {}
}
]
}
}
const params = {
TableName: "event",
Key: {
"eventId": eventId
},
UpdateExpression: "SET attendees[attendee.index].attendeeName = :value",
ExpressionAttributeValues: {
":value" : {"S":"karthik"}
},
ReturnValues: "ALL_NEW"
};
dynamo.update(params, (err, data) => {
if (err) {
return reject(err);
}
console.log(data.Attributes);
});
更新查询示例:
数据结构(保存在DynamoDB)
{
tenant_id: 'tenant_1',
users: {
user1: {
_id: 'user1',
email_address: 'test_email_1@gmail.com'
},
user2: {
_id: 'user2',
email_address: 'test_email_2@gmail.com'
}
}
}
更新数据(在参数中使用)
var user = {
email_address: 'updated@gmail.com'
}
参数
var params = {
TableName: 'tenant-Master',
Key: {
"tenant_id": 'tenant_1'
},
UpdateExpression: "set #users.user1 = :value",
ExpressionAttributeNames: {
"#users": "users"
},
ExpressionAttributeValues: {
":value": user,
},
};
说明
通过从地图数组切换到地图地图,我们现在可以使用 UpdateExpression: "set #users.user1 = :value"
来更新我们在用户地图上的嵌套对象,其 ID 为 user1
。
注意:此方法将 REPLACE users.user1
处的整个地图对象。如果您想保留 pre-existing 数据,则需要进行一些更改。