我在DynamoDB中有一个名为“任务”的表。这是“任务”中的任务的示例:
{
"taskId": "e3b8d901-6d74-4caa-9360-5b2f7aaec513",
"notes": [
{
"noteId": "aeeeeb60-3221-4d4e-b362-d63b48f42fba",
"text": "thing to do next and words",
"status": "TODO"
},
{
"noteId": "88eeeb60-3221-4d4e-b362-d63b48f42fba",
"text": "other text and stuff",
"status": "QUESTION"
}
],
"title": "Some Task"
}
我想从任务中删除笔记。删除任务很简单-我使用taskId作为键。但是,我不确定在访问数组中的嵌套项时如何使用该键,而且我无法从文档中找到它。
这是我的路线:
api.delete('/tasks/{id}/notes/{noteId}', (request) => {
return deleteNote(request.pathParams.id, request.pathParams.noteId)
}, {
error: 400
})
这就是我试图在DynamoDB中删除笔记的方法:
function deleteNote(taskId, noteId){
return docClient.delete({
TableName: 'tasks',
Key: {
noteId: noteId
}
}).promise()
.then((res) => {
console.log('Note deleted!', res)
return res
})
.catch((error) => {
console.log('Note not deleted', error);
throw error
})
}
当然,这不起作用,因为noteId不是顶级分区键。如何过滤正确任务的任务,然后过滤正确任务的笔记?我对如何使用JavaScript有所了解,但在DynamoDB中却没有。
谢谢!
要添加的更新:
正如Pari在下面指出的那样,这实际上应该是对任务的更新,而不是删除。这是我修改“编辑任务”以包含注释的方式,但是出现错误:“提供的表达式引用了该项目中不存在的属性”。
我在下面如何做到这一点的想法是,整个更新后的notes数组(删除了要删除的一个便笺的数组)将替换notes数组。
function editTask(taskId, updatedTask){
if (!taskId || !updatedTask) {
throw new Error('Insufficient infromation to update task')
}
return docClient.update({
TableName: 'tasks',
Key: {
taskId: taskId
},
UpdateExpression: 'set title = :t, set notes = :n',
ExpressionAttributeValues: {
':t': updatedTask.title,
':n': updatedTask.notes
},
ReturnValues: 'ALL_NEW'
}).promise()
.then((res) => {
console.log('Task updated!', res)
return res
})
.catch((error) => {
console.log('Task not updated', error);
throw error
})
}
答案 0 :(得分:0)
从技术上讲,“注释”不是其自己的表,因此删除它们将需要您在没有所需注释的情况下更新文档“任务”。因此,我建议您更新而不是删除文档。因此,请在执行操作时使用该ID对该任务执行get操作,然后使用.filter方法并使用splice删除该元素。然后执行.put而不是具有该ID的.delete。我肯定有办法用params做到这一点。
答案 1 :(得分:0)
因此,多看一点之后,我看到了几个java示例实现了这一点。 您是否尝试过使用更新而不是删除?
api.get('/tasks/{id}/notes/{nodeId)',(req,res)=>{
let id = req.params.id;
let noteId = req.params.noteId;
updateTask(id, noteId);
})
function updateTask(id, noteId){
return docClient.update({
TableName: 'tasks',
Key: {
noteId: noteId
}
}).promise()
.then((res) => {
console.log('Note deleted!', res)
return res
})
.catch((error) => {
console.log('Note not deleted', error);
throw error
})
}
答案 2 :(得分:0)
请使用以下命令更新您的UpdateExpression
:
UpdateExpression: 'SET title = :t, notes = :n'
,