如何使用NodeJS删除dynamoDb中的嵌套项目

时间:2018-10-12 20:26:26

标签: javascript node.js amazon-dynamodb

我在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
    })
}

3 个答案:

答案 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'