Добавление нескольких пар ключ: значение в DynamoDB к существующей карте? - PullRequest
1 голос
/ 01 августа 2020

Допустим, у меня есть элемент в тестовой таблице DynamoDB, например:

test: {
    {
        id:'100',
        page:'#test',
        general: {
            foo: 'super_foo',
            bar: {
                    item:'string_item'
                }
        }
    }
}

Я хотел бы найти способ, чтобы он закончился так:

test: {
    {
        id:'100',
        page:'#test',
        general: {
            foo: 'super_foo',
            bar: {
                item:'string_item'
                },
            bbb: { 'bbbb':'cccc' },
            ccc: 'dddd'
        }
    }
}

Я пробовал следующее (в python, используя boto3):

table.update_item(
        Key = {
            'id': '100',
            'page': 'page_name'
        },
        UpdateExpression= "set #g=:r",
        ExpressionAttributeValues={
            ':r': { 'bbb': { 'bbbb':'cccc' }, 'ccc': 'dddd' },
        },
        ExpressionAttributeNames = {
            '#g': 'general'
        },
)

... но он удалил только те элементы, которые у меня уже были:

test: {
    {
        id:'100',
        page:'#test',
        general: {
            bbb: { 'bbbb':'cccc' },
            ccc: 'dddd'
        }
    }
}

Возможно ли это делать?

1 Ответ

1 голос
/ 01 августа 2020

Попробуйте следующее:

table.update_item(
    Key={
        'id': '100',
        'page': '#test'
    },
    UpdateExpression="SET #general.#bbb = :bbb, #general.#ccc = :ccc",
    ExpressionAttributeValues={':bbb': {'bbbb':'cccc'}, ':ccc': 'dddd'},
    ExpressionAttributeNames={'#general':'general', '#bbb':'bbb', '#ccc':'ccc'}
)

Обратите внимание, что DynamoDB интерпретирует точку в имени атрибута выражения как символ в имени атрибута (в отличие от разделителя между уровнями имени иерархического атрибута), поэтому вы не можете просто установить для ExpressionAttributeNames значение general.bbb. Вместо этого вам нужно определить имя атрибута выражения для каждого элемента в пути к документу (поэтому general и bbb независимо).

...