2016-10-27 2 views
3

Проверено документа AWS, но не найдено ни одного рабочего примера.Как использовать инструкцию «IN» в FilterExpression с помощью массива - dynamodb

Вот моя попытка

var params = { 
      TableName: "User", 
      IndexName:"a-b-index", 
      KeyConditionExpression: "Country = :country and #s = :status", 
      FilterExpression: "Id IN (:e)", 
      ExpressionAttributeValues: { 
       ":country ": "USA", 
       ":status": 1, 
       ":e": "1" 

      }, 
      ExpressionAttributeNames: {"#s": "Status"} 
      }; 

      //get users 
      dynamodb.query(params, function (err, data) { 
      if (err) 
       //error 
      else { 
       //success 

      } 
      }); 

Got записи, но это выборка записи, которые имеют идентификатор 1, но я хочу использовать массив как этот

var params = { 
     TableName: "User", 
     IndexName:"a-b-index", 
     KeyConditionExpression: "Country = :country and #s = :status", 
     FilterExpression: "Id IN (:e)", 
     ExpressionAttributeValues: { 
      ":country ": "USA", 
      ":status": 1, 
      ":e": ["1","2","3"] 

     }, 
     ExpressionAttributeNames: {"#s": "Status"} 
     }; 

     //get users 
     dynamodb.query(params, function (err, data) { 
     if (err) 
      //error 
     else { 
      //success 

     } 
     }); 

Как сделать выше код, как working.want для получения записей. правильность синтаксиса и запрос запуска без ошибок, но я не получаю записей

+0

Как вы тест Это? –

+0

@NiroshanRanapathi, что вы имеете в виду? –

+0

@NiroshanRanapathi Я использую serverless framework.checking local –

ответ

7

Пожалуйста, обратитесь эту answer

Резюме: -

Для фиксированного числа значений в «IN» пункта: -

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 
}; 
+0

спасибо за ответ, попробуем, dynamodb не поддерживает соединение, и я хочу получать записи на основе других записей таблицы, поэтому я хочу использовать в операторе, потому что нет другого выбора, кроме вас говорят, что это не хорошо для 1000 пользователей с точки зрения производительности, чем лучший подход? –

+0

В этом случае вам необходимо экспортировать или передать его в EMR или что-то еще и получить необходимую информацию. Большинство баз данных NOSQL не поддерживают соединение. Другим вариантом является просмотр модели данных для хранения всех необходимых данных в одной таблице, если размер меньше 4 КБ. Обратите внимание, что большинство ответов в SO не написаны специально для этого требования. Иногда они просто указывают на проблему. – notionquest

4

notionquest «s ответ правильный, но я не могу использовать мои другие значения в ExpressionAttributeValues как :country и :status поэтому здесь модифицируют ответ, чтобы он работал в соответствии с моими требованиями

var AttributeValuesObject = {}; 

    AttributeValuesObject[':country '] = "USA"; 
    AttributeValuesObject[':status'] = 1; 

    var titleValues = ["1", "2"]; 
    var titleObject = {}; 

    var index = 0; 

    titleValues.forEach(function(value) { 
    index++; 
    var titleKey = ":titleValue"+index; 
    AttributeValuesObject[titleKey.toString()] = value; 
    titleObject[titleKey.toString()] = value; 
    }); 

    var params = { 
    TableName: "User", 
    IndexName:"a-b-index", 
    KeyConditionExpression: "Country = :country and #s = :status", 
    FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")", 
    ExpressionAttributeValues: AttributeValuesObject, 
    ExpressionAttributeNames: {"#s": "Status"} 
    }; 

    //get users 
    dynamodb.query(params, function (err, data) { 
    if (err) 
     //error 
    else { 
     //success 

    } 
    }); 
+0

Не могли бы вы принять ответ, если концепция была полезной, хотя она не была написана специально для вашего случая использования? – notionquest

Смежные вопросы