как использовать оператор in в динамо БД

У меня есть таблица пользователей с полевым именем пользователя. Мне нужно написать что-то эквивалентное этому в Dynamo db: Выберите * from user where username in ('a', 'b', 'c');

Добавление большего количества из предполагаемого кода у меня есть имена пользователей в массиве, например, var arr = ['a', 'b', 'c'];

Я до сих пор пробовал это, что дает мне нулевой результат

    this.dynamo.client.scanAsync({
        TableName: this.dynamo.table('users'),
        FilterExpression: 'username IN (:list)',
        ExpressionAttributeValues: {
            ':list': arr.toString()
        }
    }).then((response) => {
        console.log(response);
        return {
            userFriends: result.Item.friends
        };
    });

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


person Avinash Gautam    schedule 24.10.2016    source источник


Ответы (1)


Отдельные пользователи должны быть указаны в виде строковых переменных, разделенных запятыми. Массив JavaScript эквивалентен List в типе данных AWS DynamoDB. DynamoDB не может сравнить тип данных String в базе данных с атрибутом List (то есть массивом в JavaScript).

var params = {
    TableName : "Users",
    FilterExpression : "username IN (:user1, :user2)",
    ExpressionAttributeValues : {
        ":user1" : "john",
        ":user2" : "mike"
    }
};

Создайте объект из массива для FilterExpression: -

Пожалуйста, обратитесь к приведенному ниже коду для динамического формирования объекта на основе значения массива.

var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
    index++;
    var titleKey = ":titlevalue"+index;
    titleObject[titleKey.toString()] = value;
});

var params = {
    TableName : "Movies",
    FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
    ExpressionAttributeValues : titleObject
};

Примечание: -

Я не думаю, что предложение IN с тысячами имен пользователей - хорошая идея с точки зрения производительности.

person notionquest    schedule 24.10.2016
comment
скажем, у меня есть 1000 элементов в массиве имен пользователей, поэтому мне нужно писать 1000 раз? - person Avinash Gautam; 25.10.2016
comment
Я обновил ответ, чтобы динамически формировать значения атрибутов filterexpression и expression. Взгляните на это. - person notionquest; 25.10.2016
comment
спасибо хороший пример. Не могли бы вы привести пример для разбивки на страницы или ограничения с помощью запроса? - person Manish; 16.11.2018
comment
stackoverflow.com/questions/56074919/ - person Nouman Dilshad; 10.05.2019
comment
В документации Dynamodb указано: Список может содержать до 100 значений. docs.aws.amazon.com/amazondynamodb/latest/developerguide/ - person Mile Zajkovski; 18.02.2020