Как искать во вложенных элементах, DynamoDB - PullRequest
0 голосов
/ 10 июля 2020

Я хочу выполнить поиск в своей базе данных в поисках элемента внутри карты. Элемент, который я искал, это reference

ПРИМЕР СХЕМЫ БД

{
    id: "someid",
    payment_method:{
        reference:"some Reference",
        typeOf : "Card"
    }
    amount:500
} 

Я хочу посмотреть, отправляет ли клиент reference для меня фактически находится в моей БД.

Это то, что я пробовал:

function searchReference(event, callback){
    
    console.log(event.folio);
    var params = {
        TableName: process.env.TABLE_REFERENCES,
        FilterExpression: "#idRef = :data",
         ExpressionAttributeNames: {
            "#idRef": "payment_method.reference",
        },
        ExpressionAttributeValues: {
             ":data": event.folio
        }
    };
    
    docClient.scan(params, function(err, data) {
        if (err) {
            console.log("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
            var responseD = buildCallBack(403,"ReferenceError",null);
            callback(err, responseD);
        } else {
            
            console.log("data");
            console.log(data);
            
            if (isEmpty(data)) {
                var responseD = buildCallBack(403,"Reference not found",null);
                callback(null, responseD);
            } else { 
                console.log(data);
                doValidation(callback, event, data);
            }

        }
    });
}

Но когда сканирование завершено, мои данные пусты, я уверен, что reference, который я пытаюсь найти, находится в БД, но я действительно не знаю, что изменить в моем коде.

Это то, что я получаю

{ Items: [], Count: 0, ScannedCount: 2 }

Ответы [ 2 ]

1 голос
/ 10 июля 2020

понимают, что Scan () очень дорогостоящий и медленный ... поскольку вся таблица читается при каждом сканировании. Таким образом, это то, от чего вы хотите держаться подальше для любых «нормальных» случаев использования. Лично я избегаю этого для всего, кроме очень редких случаев использования.

Даже тогда поймите, что он может легко использовать все ваши подготовленные RCU, оставляя другие вызовы для повторения (обычно автоматически SDK).

Поскольку у вас есть ключ, GetItem () будет лучшим выбором.

Вы можете использовать filterexpression как документ в ответе jarmod или просто проверить клиентскую сторону. Лично я бы проверял клиентскую сторону таким образом, чтобы знать, есть ли там запись и что ref # не совпадает с записью, которой там нет. Предполагая, что это что-то значит для вашего варианта использования.

1 голос
/ 10 июля 2020

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

Например, ваши ExpressionAttributeNames будут:

"#pm":"payment_method"
"#rf":"reference"

А ваше FilterExpression будет:

"#pm.#ref=:data"

Это не очень интуитивно понятно, но его можно найти в документации по Вложенным атрибутам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...