Amazon web services AWS Lambda和Dynamo db:如何通过多个参数过滤扫描结果?
我是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(事件)=>{ 从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:
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/*谢谢!!