这是我的情况:我正在尝试使用API作为HCI.LocCatApp
发送的值在表(表名KeyConditionExpression
)上进行查询,并存储结果(必须是数字而不是字符串),我想将此数组中的每个值都用作FilterExpression
来扫描另一个表(表名HCI.Category
)..所以我需要在数组值,将它们中的每个作为FilterExpression
并执行scan
操作。我目前正在尝试使用IN
,但不确定是否支持该功能。
并请记住,在运行时将填充数组。 callback
只能执行一次。
这是我的代码:
'use strict'
var AWS = require('aws-sdk');
var mydocumentClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function (event, context, callback) {
var params = {
TableName: 'HCI.LocCatApp',
KeyConditionExpression : 'LocID = :lid',
ExpressionAttributeValues: {
":lid": event.LocID
},
ProjectionExpression: 'CatID'
};
var catIDs = [];
var catIDsObject = {};
var index = 0;
mydocumentClient.query(params, function (err, data){
if (err) {
callback(err, null);
}else{
data.Items.forEach(function(item){catIDs.push(item.CatID)});
//callback(null, catIDs);
}
})
catIDs.forEach(function(value){
index ++;
var catIDsKey = ":catID"+index;
catIDsObject[catIDsKey] = value;
})
var params2 = {
TableName: 'HCI.Category',
FilterExpression : "CatID IN (:cIDs)",
ExpressionAttributeValues : {
':cIDs' : catIDs
}
};
mydocumentClient.scan(params2, function (err, data){
if (err) {
callback(err, null);
}else{
callback(null, data);
}
})
}
由于某种原因,当前代码可以成功运行,但是找不到任何匹配项,即使我在数组中手动填写值,也仍然没有结果,IN
操作似乎无法工作。
非常感谢!
答案 0 :(得分:0)
在您的代码catIds
中是一个ID数组(可能是字符串)。
当您将其传递给FilterExpression时,您假设它将被转换为a)字符串b)为正确格式的字符串。
FilterExpression : "CatID IN (:cIDs)",
ExpressionAttributeValues : {
':cIDs' : catIDs
}
我目前无法自己尝试,但是我假设这是查询失败的地方。 IN
运算符期望用逗号分隔的值列表进行括号比较。因此,在插入数组进行查询之后,应该是这样
FilterExpression : "CatID IN (cat1, cat2, cat2)",
但是很可能它包含额外的[
和]
集,甚至从数组到字符串的转换都可能导致它变成类似[Object object]
之类的东西。
一种解决方案是使用Array.join
将数组中的所有元素连接到单个字符串,然后再将其传递给FilterExperession。像这样
FilterExpression : "CatID IN (:cIDs)",
ExpressionAttributeValues : {
':cIDs' : catIDs.join()
}