如何使用 AND & OR 编写 DynamoDB 查询过滤器?
How to write DynamoDB query filter using AND & OR?
我有一个用户 table,我想使用以下查询获取数据,出于教育目的,我使用了类似 SQL 的查询。
SELECT * FROM User
WHERE (gender = "Male")
AND (age between 25-30 OR height between 5.4-5.9 OR city="India, US")
我正在尝试使用 Node.js
在 AWS Lambda 中创建上述查询
如有任何反馈,我们将不胜感激。
以下是使用 awscli 的方法:
aws dynamodb scan \
--table-name User \
--filter-expression "(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))" \
--expression-attribute-values '{":gender":{"S":"Male"}, ":age1":{"N":"25"}, ":age2":{"N":"30"}, ":h1":{"N":"5.4"}, ":h2":{"N":"5.9"}, ":city":{"S":"India, US"}}'
以下是使用 low-level AWS JavaScript SDK 函数的方法:
const AWS = require("aws-sdk");
AWS.config.update({region: 'us-east-1'});
const ddb = new AWS.DynamoDB();
const params = {
TableName: 'User',
FilterExpression: '(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))',
ExpressionAttributeValues: {
':gender': {S: 'Male'},
':age1': {N: '25'},
':age2': {N: '30'},
':h1': {N: '5.4'},
':h2': {N: '5.9'},
':city' : {S: 'India, US'},
},
};
ddb.scan(params, (err, data) => {
if (err) {
console.log('Error:', err);
} else {
for (const item of data.Items) {
console.log(item);
};
}
});
最后,下面是使用 higher-level DynamoDB DocumentClient 的方法,它使属性映射变得更加简单:
const AWS = require("aws-sdk");
AWS.config.update({region: 'us-east-1'});
const dc = new AWS.DynamoDB.DocumentClient();
const params = {
TableName: 'User',
FilterExpression: '(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))',
ExpressionAttributeValues: {
':gender': 'Male',
':age1': 25,
':age2': 30,
':h1': 5.4,
':h2': 5.9,
':city': 'India, US',
}
};
dc.scan(params, (err, data) => {
if (err) {
console.log('Error:', err);
} else {
for (const item of data.Items) {
console.log(item);
};
}
});
请注意,这些是 table scans,因此访问了 table 中的所有项目。
我有一个用户 table,我想使用以下查询获取数据,出于教育目的,我使用了类似 SQL 的查询。
SELECT * FROM User
WHERE (gender = "Male")
AND (age between 25-30 OR height between 5.4-5.9 OR city="India, US")
我正在尝试使用 Node.js
在 AWS Lambda 中创建上述查询如有任何反馈,我们将不胜感激。
以下是使用 awscli 的方法:
aws dynamodb scan \
--table-name User \
--filter-expression "(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))" \
--expression-attribute-values '{":gender":{"S":"Male"}, ":age1":{"N":"25"}, ":age2":{"N":"30"}, ":h1":{"N":"5.4"}, ":h2":{"N":"5.9"}, ":city":{"S":"India, US"}}'
以下是使用 low-level AWS JavaScript SDK 函数的方法:
const AWS = require("aws-sdk");
AWS.config.update({region: 'us-east-1'});
const ddb = new AWS.DynamoDB();
const params = {
TableName: 'User',
FilterExpression: '(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))',
ExpressionAttributeValues: {
':gender': {S: 'Male'},
':age1': {N: '25'},
':age2': {N: '30'},
':h1': {N: '5.4'},
':h2': {N: '5.9'},
':city' : {S: 'India, US'},
},
};
ddb.scan(params, (err, data) => {
if (err) {
console.log('Error:', err);
} else {
for (const item of data.Items) {
console.log(item);
};
}
});
最后,下面是使用 higher-level DynamoDB DocumentClient 的方法,它使属性映射变得更加简单:
const AWS = require("aws-sdk");
AWS.config.update({region: 'us-east-1'});
const dc = new AWS.DynamoDB.DocumentClient();
const params = {
TableName: 'User',
FilterExpression: '(gender = :gender) AND ((age BETWEEN :age1 AND :age2) OR (height BETWEEN :h1 AND :h2) OR (city = :city))',
ExpressionAttributeValues: {
':gender': 'Male',
':age1': 25,
':age2': 30,
':h1': 5.4,
':h2': 5.9,
':city': 'India, US',
}
};
dc.scan(params, (err, data) => {
if (err) {
console.log('Error:', err);
} else {
for (const item of data.Items) {
console.log(item);
};
}
});
请注意,这些是 table scans,因此访问了 table 中的所有项目。