Удалить объект из вложенного списка таблицы базы данных Dynamo, если он существует

Я использую узел с aws-sdk, чтобы попытаться удалить элемент (объект) из вложенного списка объектов в таблице Dynamo db, если он существует, но это кажется более сложным, чем я надеялся.

Я видел этот ответ на аналогичный вопрос ранее, но они упустили, как они на самом деле получили индекс, который они пытаются удалить.

Добавить или удалить запись из атрибута типа списка в элементе таблицы DynamoDB

То, что у меня есть, выглядит так:

{
  id: "1",
  resources: {
    resource1: [
      {
        resource1Id: "63236",
        name: "This is the first resource1 resource"
      }
    ],
    resource2: [
      {
        resource2Id: "63236",
        name: "This is the first resource2 resource"
      },
      {
        resource2Id: "12345",
        name: "I want to remove this"
      }
    ]
  {
}

теперь скажем, я хочу удалить это:

{
  resource2Id: "12345",
  name: "I want to remove this"
}

из списка ресурсов2

Я думаю, мне нужно сделать что-то вроде этого:

    query = "REMOVE resources.resource2[%d]" % (index_to_be_removed)

    const updateParams = {
      TableName: myTable,
      Key: {
        "id": myId
      },
      "UpdateExpression": "query",
      "ReturnValues": "UPDATED_NEW"
    }
    return await this.dynamodbClient.update(updateParams).promise()

Но я не уверен, как получить index_to_be_removed. Неужели они не ожидают, что я сам сделаю отдельный запрос и пройдусь по списку? Кажется, должен быть способ сообщить им идентификатор в списке, чтобы искать и удалять его, если он существует, за один вызов.


person skyleguy    schedule 20.10.2020    source источник


Ответы (1)


К сожалению, DynamoDB не предоставляет возможности поиска индекса внутри выражения UpdateExpression. Это то, что вам нужно сделать в коде вашего приложения.

Это один из недостатков использования сложных атрибутов для моделирования отношений «один ко многим».

person Seth Geoghegan    schedule 20.10.2020
comment
облом, к счастью, я пошел вперед и уже сделал это, но, конечно, облом, это невозможно сделать без того, чтобы мне пришлось делать два отдельных звонка. Спасибо, что дали мне знать - person skyleguy; 20.10.2020