高级要求:
我正在考虑使用Dynamo DB来实现它,通过以下列格式存储数据(使用NOSQL的动机是快速的,因为在一次获取我将获得整个数据):
{
"userID" : 2323423,
"favs" : [
userIDA,
userIDB,
...
],
"lt" : [
{"timestamp1" : "coordinate1"},
{"timestamp2" : "coordinate2"},
...
]
}
userID是主键。
查询要求是
我非常确定(1)使用List数据类型上的添加/删除API是直截了当的。 我如何解决查询(2)?如果UPDATE查询本身以某种方式迭代所有对象并删除旧的对象,那将是最好的。我已经读过Dynamo DB理解的列表中的索引是整数格式的,所以我们能以某种方式利用它吗?列表中的元素是否始终从0到N索引?如果是这样,我可以从数组的开头删除适当数量的元素。有没有办法做到这一点?
我愿意使用不同的数据架构,但请让我知道整个推理以及如何解决这个问题。
答案 0 :(得分:4)
1)属性“favs”应定义为SET数据类型,以便使用DELETE功能。请注意,您不能在LIST数据类型上使用DELETE。
删除操作符只能在SET上使用。
DELETE - 删除集合中的元素。
如果指定了一组值,则从中减去这些值 旧集。例如,如果属性值是集合[a,b,c] 并且DELETE操作指定[a,c],然后指定最终属性值 为B]。指定空集是一个错误。
DELETE操作仅支持设置数据类型。另外,DELETE 只能用于顶级属性,而不能用于嵌套属性。
2)要从LIST数据类型中删除事件(即Object),您应该知道索引。更新表达式可能如下所示: -
UpdateExpression:“REMOVE lt [0]” - 删除一个元素
UpdateExpression:“REMOVE lt [0] lt [1]” - 删除元素0和1
是的,对于LIST数据类型,索引从0到N开始。
3)有条件地删除项目 - 是的,您可以在ConditionExpression中包含条件。但是,REMOVE需要列表项的索引。否则,它将删除整个列表(即不是列表中的特定索引)。
此外,当您想在列表中引用MAP对象时,您需要列表索引。
示例:强> 要删除media.id = 3,条件和更新表达式应如下所述: -
请注意,索引用于条件表达式和更新表达式。
要删除“media.id”的JavaScript语法= 3: -
var params = {
TableName : "Product",
Key : {
"product" : "IPhone 7+"
},
UpdateExpression : "REMOVE media[2]",
ConditionExpression: "media[2].id = :idvalue",
ExpressionAttributeValues: {":idvalue" : "3",
},
ReturnValues : "UPDATED_NEW"
};
数据: - 强>
"media": {
"L": [{
"M": {
"url": {
"S": "http://www.apple.com/iphone-6-plus/a.jpg"
},
"type": {
"S": "image"
},
"id": {
"S": "1"
}
}
}, {
"M": {
"url": {
"S": "http://www.apple.com/iphone-6-plus/b.jpg"
},
"type": {
"S": "image"
},
"id": {
"S": "2"
}
}
}, {
"M": {
"url": {
"S": "http://www.apple.com/iphone-6-plus/overvie
w.mp4 "
},
"type": {
"S": "video"
},
"id": {
"S": "3"
}
}
}]
}