我有这个架构:
{
product: S // Primary Key, // my Hash
media: L // List of Maps
}
每个媒体项目都是这样的:
[
{
id: S, // for example: id: uuid()
type: S, // for example: "image"
url: S // for example: id: "http://domain.com/image.jpg"
}
]
示例数据:
{
product: "IPhone 6+",
media: [
{
id: "1",
type: "image",
url: "http://www.apple.com/iphone-6-plus/a.jpg"
},
{
id: "2",
type: "image",
url: "http://www.apple.com/iphone-6-plus/b.jpg"
},
{
id: "3",
type: "video",
url: "http://www.apple.com/iphone-6-plus/overview.mp4"
}
]
}
我希望能够通过ID从媒体列表中删除。 类似于:“从产品:'IPhone 6+',删除ID为'2'的媒体
查询后,数据应如下所示:
{
product: "IPhone 6+",
media: [
{
id: "1",
type: "image",
url: "http://www.apple.com/iphone-6-plus/a.jpg"
},
{
id: "3",
type: "video",
url: "http://www.apple.com/iphone-6-plus/overview.mp4"
}
]
}
我应该如何表达这样的查询?我在UpdateItem上看到了一篇帖子,但我找不到这个查询类型的好例子。
谢谢!
答案 0 :(得分:4)
不幸的是,API没有此功能。你可以做的最接近的是删除" List"数据类型,如果你知道索引。
据我所知,大部分时间索引都无法使用。但是,如果您没有任何其他解决方案,则可以查看此备用选项。
您还需要了解,即使DynamoDB开始支持List,Map和Set等Document数据类型,您也无法执行某些操作。 API中还有一些功能尚未添加。我相信这种情况就是其中之一。
我已使用 REMOVE 从列表中删除该项目。
var params = {
TableName : "Product",
Key : {
"product" : "IPhone 6+"
},
UpdateExpression : "REMOVE media[0]",
ReturnValues : "UPDATED_NEW"
};
console.log("Updating the item...");
docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data));
}
});
这仅供您参考: -
删除操作符只能在SET上使用。
删除 - 删除集中的元素。
如果指定了一组值,则从中减去这些值 旧集。例如,如果属性值是集合[a,b,c] 并且DELETE操作指定[a,c],然后指定最终属性值 为B]。指定空集是一个错误。
DELETE操作仅支持设置数据类型。另外,DELETE 只能用于顶级属性,而不能用于嵌套属性。