如何使用array - dynamodb在FilterExpression中使用"IN"语句

Nir*_*ami 10 node.js amazon-dynamodb aws-sdk

检查了AWS文档但没有找到任何有效的示例.

这是我的尝试

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

            }
          });
Run Code Online (Sandbox Code Playgroud)

有记录,但它正在获取有id的记录,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

        }
       });
Run Code Online (Sandbox Code Playgroud)

如何将上面的代码作为working.want来获取记录.语法是正确的,查询运行没有错误,但我没有得到记录

not*_*est 23

请参考这个答案

摘要:-

对于"IN"子句中固定数量的值: -

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

对于数组中的更多元素并动态形成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
};
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的:“ KeyConditions”或“ KeyConditionExpression”为必填字段 (3认同)
  • 不需要保留索引变量,forEach回调中的第二个参数是当前值的索引:`titleValues.foreach(function (value, index) { ...` (3认同)

Nir*_*ami 6

notionquest的答案是正确的,但我不能在使用我的其他值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

    }
   });
Run Code Online (Sandbox Code Playgroud)


kor*_*ord 5

我是这样做的,解析一次params列表

const users = [{userId:1, name:'joe'}, {userId:2, name:'mike'}]
const expressionAttributeValues = {};
const userIdParams = users.map((u, i) => {
  const userParam = `:user${i}`;
  expressionAttributeValues[userParam] = u.userId;
  return userParam;
}).join(',')
var params = {
    TableName : 'Users',
    FilterExpression : `username IN (${userIdParams})`,
    ExpressionAttributeValues : expressionAttributeValues
};
Run Code Online (Sandbox Code Playgroud)


grn*_*rnc 5

Python3版本:

def get_filter_for_in_clause(column_name, in_values, column_type="S"):
    expressions = []
    for i in range(len(in_values)):
        expressions.append(f':temp{i}')
    filter_expression = f'{column_name} IN ({", ".join(expressions)})'

    expression_attribute_values = {}
    for index, expression in enumerate(expressions):
        expression_attribute_values[expression] = {column_type: in_values[index]}

    return filter_expression, expression_attribute_values
Run Code Online (Sandbox Code Playgroud)

用法:

column = 'testcolumn'
inputs = ['testvalue1', 'testvalue2', 'testvalue3']
filter_expression, expression_attribute_values = get_filter_for_in_clause(column, inputs)
Run Code Online (Sandbox Code Playgroud)

结果:

# filter_expression = 'testcolumn IN (:temp0, :temp1, :temp2)'
# expression_attribute_values = {':temp0': {'S': 'testvalue1'}, ':temp1': {'S': 'testvalue2'}, ':temp2': {'S': 'testvalue3'}}
Run Code Online (Sandbox Code Playgroud)