Использование оператора IN в DynamoDB из Boto3 - PullRequest
0 голосов
/ 15 января 2020

Я новичок в DynamoDB и пытаюсь сделать запрос к таблице, основываясь на наличии списка определенных значений для поля.

У меня есть поле doc_id, которое также является вторичным индексом, и я хотел бы вернуть все результаты, где doc_id содержится в списке значений.

Я пытаюсь что-то вроде этого:

response = table.query(
IndexName='doc_id-index',
FilterExpression=In(['27242226'])
)

Но, очевидно, это не правильно.

Кто-нибудь может указать мне правильное направление?

Спасибо!

1 Ответ

0 голосов
/ 15 января 2020


с операцией запроса

В выражении FilterExpression не разрешены ключевые атрибуты. Вы не можете определить выражение фильтра на основе ключа раздела или ключа сортировки.

Итак, ваше поле doc_id является ключом раздела doc_id-index и не может использоваться в FilterExpression.

Примечание
FilterExpression применяется после того, как элементы уже прочитаны; процесс фильтрации не потребляет дополнительных единиц емкости чтения.

Я предполагаю, что у вас есть другое поле, например userId, просто чтобы показать, как реализовать операцию IN. (Запрос)

var params = {
    TableName: 'tbl',
    IndexName: 'doc_id-index',
    KeyConditionExpression: 'doc_id= :doc_id', 
    FilterExpression: 'userId IN (:userId1,:userId2)',//you can add more userId here

    ExpressionAttributeValues: {
         ':doc_id':100,
         ':userId1':11,
         ':userId2':12
                                 }

};


Если у вас есть больше userId, вам следует динамически передавать FilterExpression.


, но в вашем случае вы можете использовать операцию сканирования

var params = {
    TableName : "tbl",
    FilterExpression : "doc_id IN (:doc_id1, :doc_id2)",
    ExpressionAttributeValues : {
                   ":doc_id1" :100,
                   ":doc_id2" :101
                                 }
                    };

и даже передать в FilterExpression динамически, как показано ниже

var documentsId = ["100", "101","200",...];
var documentsObj = {};
var index = 0;
documentsId.forEach((value)=> {
    index++;
    var documentKey = ":doc_id"+index;
    documentsObj[documentKey.toString()] = value;
});

var params = {
    TableName: 'job',
    FilterExpression: 'doc_id IN ('+Object.keys(documentsObj).toString()+')',
    ExpressionAttributeValues: documentsObj,
};


Примечание : будьте осторожны при использовании операции сканирования, менее эффективны, чем Query.

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