如何使用数组在 FilterExpression 中使用“IN”语句 - dynamodb
How to use “IN” statement in FilterExpression using array - dynamodb
检查了 AWS 文档但未找到任何工作示例。
这是我的尝试
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": "1"
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
获得记录,但它正在获取具有 ID 1
的记录,但我想使用这样的数组
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": ["1","2","3"]
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
如何让上面的代码像working.want一样获取记录。语法正确,查询 运行 没有错误,但我没有得到记录
请参考这个answer
总结:-
对于 "IN" 子句中固定数量的值:-
var params = {
TableName : "Users",
FilterExpression : "username IN (:user1, :user2)",
ExpressionAttributeValues : {
":user1" : "john",
":user2" : "mike"
}
};
数组中的更多元素和动态形成 FilterExpression:-
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titlevalue"+index;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName : "Movies",
FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues : titleObject
};
notionquest 的答案是正确的,但我不能在 ExpressionAttributeValues
中使用我的其他值,如 :country
和 :status
所以这里修改答案以使其工作根据我的要求
var AttributeValuesObject = {};
AttributeValuesObject[':country '] = "USA";
AttributeValuesObject[':status'] = 1;
var titleValues = ["1", "2"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titleValue"+index;
AttributeValuesObject[titleKey.toString()] = value;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues: AttributeValuesObject,
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
使用 es5 和地图:
const params = {
TableName: 'personalizations',
KeyConditionExpression: 'accountId = :accountId',
FilterExpression: `websiteId IN (${websites.map(w => `:${w.websiteId}`).join(',')})`,
ExpressionAttributeValues: {':accountId': accountId}
}
for (const website of websites) {
params.ExpressionAttributeValues[`:${website.websiteId}`] = website.websiteId
}
const {Items: personalizations} = await docClient.query(params).promise()
您也可以使用 notionquest 的方法,只需将您的其他属性值插入 titleObject{}
。
例如
var titleObject = { ": country": "USA", ":status": 1, };
Note: You might have to add schema like "S" if you're not using
DocumentClient
var titleObject = {
":country": { "S":"USA" }, ...
}
我已经这样做了,解析一次params列表
const users = [{userId:1, name:'joe'}, {userId:2, name:'mike'}]
const expressionAttributeValues = {};
const userIdParams = users.map((u, i) => {
const userParam = `:user${i}`;
expressionAttributeValues[userParam] = u.userId;
return userParam;
}).join(',')
var params = {
TableName : 'Users',
FilterExpression : `username IN (${userIdParams})`,
ExpressionAttributeValues : expressionAttributeValues
};
Python3版本:
def get_filter_for_in_clause(column_name, in_values, column_type="S"):
expressions = []
for i in range(len(in_values)):
expressions.append(f':temp{i}')
filter_expression = f'{column_name} IN ({", ".join(expressions)})'
expression_attribute_values = {}
for index, expression in enumerate(expressions):
expression_attribute_values[expression] = {column_type: in_values[index]}
return filter_expression, expression_attribute_values
用法:
column = 'testcolumn'
inputs = ['testvalue1', 'testvalue2', 'testvalue3']
filter_expression, expression_attribute_values = get_filter_for_in_clause(column, inputs)
结果:
# filter_expression = 'testcolumn IN (:temp0, :temp1, :temp2)'
# expression_attribute_values = {':temp0': {'S': 'testvalue1'}, ':temp1': {'S': 'testvalue2'}, ':temp2': {'S': 'testvalue3'}}
检查了 AWS 文档但未找到任何工作示例。
这是我的尝试
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": "1"
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
获得记录,但它正在获取具有 ID 1
的记录,但我想使用这样的数组
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": ["1","2","3"]
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
如何让上面的代码像working.want一样获取记录。语法正确,查询 运行 没有错误,但我没有得到记录
请参考这个answer
总结:-
对于 "IN" 子句中固定数量的值:-
var params = {
TableName : "Users",
FilterExpression : "username IN (:user1, :user2)",
ExpressionAttributeValues : {
":user1" : "john",
":user2" : "mike"
}
};
数组中的更多元素和动态形成 FilterExpression:-
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titlevalue"+index;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName : "Movies",
FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues : titleObject
};
notionquest 的答案是正确的,但我不能在 ExpressionAttributeValues
中使用我的其他值,如 :country
和 :status
所以这里修改答案以使其工作根据我的要求
var AttributeValuesObject = {};
AttributeValuesObject[':country '] = "USA";
AttributeValuesObject[':status'] = 1;
var titleValues = ["1", "2"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titleValue"+index;
AttributeValuesObject[titleKey.toString()] = value;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues: AttributeValuesObject,
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
使用 es5 和地图:
const params = {
TableName: 'personalizations',
KeyConditionExpression: 'accountId = :accountId',
FilterExpression: `websiteId IN (${websites.map(w => `:${w.websiteId}`).join(',')})`,
ExpressionAttributeValues: {':accountId': accountId}
}
for (const website of websites) {
params.ExpressionAttributeValues[`:${website.websiteId}`] = website.websiteId
}
const {Items: personalizations} = await docClient.query(params).promise()
您也可以使用 notionquest 的方法,只需将您的其他属性值插入 titleObject{}
。
例如
var titleObject = { ": country": "USA", ":status": 1, };
Note: You might have to add schema like "S" if you're not using DocumentClient
var titleObject = {
":country": { "S":"USA" }, ...
}
我已经这样做了,解析一次params列表
const users = [{userId:1, name:'joe'}, {userId:2, name:'mike'}]
const expressionAttributeValues = {};
const userIdParams = users.map((u, i) => {
const userParam = `:user${i}`;
expressionAttributeValues[userParam] = u.userId;
return userParam;
}).join(',')
var params = {
TableName : 'Users',
FilterExpression : `username IN (${userIdParams})`,
ExpressionAttributeValues : expressionAttributeValues
};
Python3版本:
def get_filter_for_in_clause(column_name, in_values, column_type="S"):
expressions = []
for i in range(len(in_values)):
expressions.append(f':temp{i}')
filter_expression = f'{column_name} IN ({", ".join(expressions)})'
expression_attribute_values = {}
for index, expression in enumerate(expressions):
expression_attribute_values[expression] = {column_type: in_values[index]}
return filter_expression, expression_attribute_values
用法:
column = 'testcolumn'
inputs = ['testvalue1', 'testvalue2', 'testvalue3']
filter_expression, expression_attribute_values = get_filter_for_in_clause(column, inputs)
结果:
# filter_expression = 'testcolumn IN (:temp0, :temp1, :temp2)'
# expression_attribute_values = {':temp0': {'S': 'testvalue1'}, ':temp1': {'S': 'testvalue2'}, ':temp2': {'S': 'testvalue3'}}