Amazon web services AWS Lambda和Dynamo db:如何通过多个参数过滤扫描结果?

Amazon web services AWS Lambda和Dynamo db:如何通过多个参数过滤扫描结果?,amazon-web-services,aws-lambda,amazon-dynamodb,aws-api-gateway,dynamodb-queries,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Aws Api Gateway,Dynamodb Queries,我是AWS和迪纳摩的新手。我正在使用React.js前端和AWS(网关API、Lambda、Dynamo)后端处理我的项目。 这是我的应用程序位置: 单击“获取提示”后,我收到服务器响应。如果单击关键字-这些关键字将添加到请求的GET参数列表中,如: topic=blah&keywords=blah1、blah2、blah3 以下是我的问题的详细信息: 在我的Lambda中: .. const docClient=new AWS.DynamoDB.DocumentClient({region:

我是AWS和迪纳摩的新手。我正在使用React.js前端和AWS(网关API、Lambda、Dynamo)后端处理我的项目。 这是我的应用程序位置:

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

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

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

GET
我收到以下参数:

const topicName = event.queryParams.topic="React";
const keywords = event.queryParams.topic.keywords="blah1,blah2,blah3";
…此处的某些代码将关键字字符串转换为数组:

const关键字array=[blah1,blah2,blah3]

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

[ { "S" : "javascript" }, { "S" : "programming" }, { "S" : "React" } ]
我的主分区键是:id(Number)

我尝试过不同的方式和方法,使用扫描和查询-什么都不管用。我被卡住了。。 我尝试过以下方法:

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"
        }
};
当我使用“扫描”时,如果我试图使用“关键字”,结果总是空的[]。 它仅适用于以下最小值:

    const params = {
        TableName : currentTable,
        FilterExpression:'topic = :topic',
        ExpressionAttributeValues:{
            ":topic" : requestedTopic
        }
    };
…根据
requestedTopic
提供所有记录

如果我使用“查询”,它会抱怨我的密钥名(“id”)太短,必须至少有3个字符长

我被困住了,优雅地请求你的帮助!
谢谢!

如果您试图匹配主题和任何一个关键字,请使用以下内容:

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',
  },
};

如果您试图匹配主题和所有关键字,请使用以下内容:

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',
  },
};

你的过滤表达式有一个输入错误:“topic=:topic an#keywords IN…”大概是“an”应该读为“and”。jarmod,谢谢你的重播!你是对的,有一个类型,应该是“and”。我希望它能解决我的问题,但它不能:-/基本上我正在寻找任何可以查询(或扫描然后过滤)的解决方案我的dynamo表由类似[{“S”:“javascript”}、{“S”:“programming”}、{“S”:“React”}的关键字列表组成…那么表中的关键字属性本身就是一个列表?您正在尝试将部分或所有查询关键字与之匹配?我不知道这是如何工作的。您使用in在值列表中查找单个值,而不是在另一个值列表中查找值列表。如果我正确理解您尝试的查询。嗨,jarmod,谢谢获得回复!是的,关键字本身就是一个列表。我同意,我的查询是错误的。我是dynamodb的新手。我没有主意了。你能建议一下如何以正确的方式构造查询(或扫描)吗?谢谢!嗨,Jarmod,谢谢!!这正是我要找的!事实上,我正试图以如下格式使用它:':kw1':{“S”:“react”}ExpressionAttributeValues中的“':kw1':'react'”很神奇!我还必须包括以下内容:
IndexName:“主题索引”
并为“主题”列创建此索引。我还从docClient.scan(..)切换到docClient.query(..)并在IAM中为我的Lambda设置适当的权限,以便能够查询表并允许访问:arn:aws:mydbstuff/index/*谢谢!!