I want to query a dynamodb Table and I want to retrive and filter data using KeyConditionExpression and FilterExpression. Following the code below, how is the appropriate way to acomplish that?
<code>getMyFunction = async (fromNumber = null, toNumber = null, startDate = null, endDate = null, size = null) => {
const client = getClient();
try {
const index = fromNumber ? 2 : 3;
let searches = [];
// ...
let attributes = {
":gsipk": { S: (fromNumber ? this.getGSI2PK() : this.getGSI3PK()) },
...(fromNumber ? { ":from": { S: fromNumber } } : { }),
...(!fromNumber && toNumber ? { ":to": { S: toNumber } } : { }),
":startdate":startdate,
":enddate": enddate
};
const result = await client
.query({
TableName: process.env.DB_TABLE_NAME,
IndexName: `GSI${index}`,
KeyConditionExpression: `GSI${index}PK = :gsipk AND begins_with(GSI${index}SK, :${(fromNumber ? 'from' : 'to')})`,
FilterExpression: `GSI${index}PK = :gsipk BETWEEN :startdate AND :enddate`,
ExpressionAttributeValues: attributes,
ScanIndexForward: false
})
.promise();
searches = result.Items.map((item) => unmarshall(item))
return [null, searches ];
} catch (error) {
return [error];
}
}
</code>
<code>getMyFunction = async (fromNumber = null, toNumber = null, startDate = null, endDate = null, size = null) => {
const client = getClient();
try {
const index = fromNumber ? 2 : 3;
let searches = [];
// ...
let attributes = {
":gsipk": { S: (fromNumber ? this.getGSI2PK() : this.getGSI3PK()) },
...(fromNumber ? { ":from": { S: fromNumber } } : { }),
...(!fromNumber && toNumber ? { ":to": { S: toNumber } } : { }),
":startdate":startdate,
":enddate": enddate
};
const result = await client
.query({
TableName: process.env.DB_TABLE_NAME,
IndexName: `GSI${index}`,
KeyConditionExpression: `GSI${index}PK = :gsipk AND begins_with(GSI${index}SK, :${(fromNumber ? 'from' : 'to')})`,
FilterExpression: `GSI${index}PK = :gsipk BETWEEN :startdate AND :enddate`,
ExpressionAttributeValues: attributes,
ScanIndexForward: false
})
.promise();
searches = result.Items.map((item) => unmarshall(item))
return [null, searches ];
} catch (error) {
return [error];
}
}
</code>
getMyFunction = async (fromNumber = null, toNumber = null, startDate = null, endDate = null, size = null) => {
const client = getClient();
try {
const index = fromNumber ? 2 : 3;
let searches = [];
// ...
let attributes = {
":gsipk": { S: (fromNumber ? this.getGSI2PK() : this.getGSI3PK()) },
...(fromNumber ? { ":from": { S: fromNumber } } : { }),
...(!fromNumber && toNumber ? { ":to": { S: toNumber } } : { }),
":startdate":startdate,
":enddate": enddate
};
const result = await client
.query({
TableName: process.env.DB_TABLE_NAME,
IndexName: `GSI${index}`,
KeyConditionExpression: `GSI${index}PK = :gsipk AND begins_with(GSI${index}SK, :${(fromNumber ? 'from' : 'to')})`,
FilterExpression: `GSI${index}PK = :gsipk BETWEEN :startdate AND :enddate`,
ExpressionAttributeValues: attributes,
ScanIndexForward: false
})
.promise();
searches = result.Items.map((item) => unmarshall(item))
return [null, searches ];
} catch (error) {
return [error];
}
}