AWS Lambda和Dynamo数据库:如何通过多个参数过滤扫描结果?

时间:2019-06-07 21:57:09

标签: amazon-web-services aws-lambda amazon-dynamodb aws-api-gateway dynamodb-queries

我是AWS和Dynamo的新手。我使用React.js前端和AWS(网关API,Lambda,Dynamo)后端进行项目。 这是我的应用位置:

https://www.alphaux.com

单击“获取提示”后,我收到服务器响应。如果我单击一个关键字,这些关键字将添加到该请求的GET参数列表中,例如: topic = blah&keywords = blah1,blah2,blah3

以下是我的问题的详细信息:

在我的Lambda中: .. const docClient =新的AWS.DynamoDB.DocumentClient({region:'us-west-2'}); exports.handler =异步(事件)=> {..

GET起,我收到以下参数:

const topicName = event.queryParams.topic="React";
const keywords = event.queryParams.topic.keywords="blah1,blah2,blah3";

..一些代码将关键字字符串转换为数组:

const keywordsArray = [blah1,blah2,blah3];

在dynamodb中,它们以以下方式存在:

[ { "S" : "javascript" }, { "S" : "programming" }, { "S" : "React" } ]

我的主分区键是:id(数字)

我尝试了不同的方式和方法,使用了扫描和查询-没有任何效果。我被卡住了。 我尝试了以下方法:

const listToObjectMappings = () => {
    let x = {};
    /* keywords hardcoded for now: */
    const keywords = ["javascript", "React"]; 
    keywords.map(item => x[':' + item] = item)
    return x
}
let mappings = listToObjectMappings()
let joined = Object.keys(mappings).join();

var params2 = {
        TableName : "my-little-table",
        FilterExpression: 'topic = :topic and #keywords IN (' + joined + ')',
            ExpressionAttributeNames: {
              '#keywords' : 'keywords'
        },
        ExpressionAttributeValues:{
            ":topic" : "React"
        }
};
 var params = {
    TableName: "my-little-table",
    FilterExpression: "#topic = :topic",
    ExpressionAttributeNames: {
      "#topic": "topic"
    },
    ExpressionAttributeValues: {
      ":topic": "React"
    }
  };

    let result;
    try {
        /* scan DB */
        result = await docClient.scan(params).promise();
    }
    catch(ex) {
        result = ex;
    }  

当我尝试使用“关键字”时,使用“扫描”时,结果始终为空[]。 它仅适用于最低要求,例如:

    const params = {
        TableName : currentTable,
        FilterExpression:'topic = :topic',
        ExpressionAttributeValues:{
            ":topic" : requestedTopic
        }
    };

..这会给我基于requestedTopic的所有记录。

如果我使用“查询”,它会抱怨我的键名(“ id”)太短,并且必须至少3个字符。

我陷入困境,并优雅地寻求您的帮助! 谢谢!

1 个答案:

答案 0 :(得分:1)

如果您要匹配主题和任何一个关键字,请使用类似这样的内容:

const params = {
  TableName: 'mytable',
  FilterExpression: '#tp = :tp AND (contains(#kw, :kw1) OR contains(#kw, :kw2))',
  ExpressionAttributeNames: {
    '#tp': 'topic',
    '#kw': 'keywords',
  },
  ExpressionAttributeValues: {
    ':tp': 'React',
    ':kw1': 'react',
    ':kw2': 'react-router',
  },
};

如果您要匹配主题和所有关键字,则使用类似以下的内容:

const params = {
  TableName: 'mytable',
  FilterExpression: '#tp = :tp AND contains(#kw, :kw1) AND contains(#kw, :kw2)',
  ExpressionAttributeNames: {
    '#tp': 'topic',
    '#kw': 'keywords',
  },
  ExpressionAttributeValues: {
    ':tp': 'React',
    ':kw1': 'react',
    ':kw2': 'react-router',
  },
};