我是AWS和Dynamo的新手。我使用React.js前端和AWS(网关API,Lambda,Dynamo)后端进行项目。 这是我的应用位置:
单击“获取提示”后,我收到服务器响应。如果我单击一个关键字,这些关键字将添加到该请求的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个字符。
我陷入困境,并优雅地寻求您的帮助! 谢谢!
答案 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',
},
};