Javascript 如何使用多个运算符查询dynamodb GSI
假设我有一个具有此模型的实体:Javascript 如何使用多个运算符查询dynamodb GSI,javascript,node.js,amazon-web-services,amazon-dynamodb,dynamodb-queries,Javascript,Node.js,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,假设我有一个具有此模型的实体: { id: 'apples', createdAt: 'some date' rate: 430, side: 'SELL', status: 'OPEN', GSI1: 'SELL#OPEN#430' GSI2: 'apples' } 我想使用GSI2的GSI属性作为散列进行查询,GSI1作为范围。 我要找的查询是getall apples(GSI2),其中GSI1以SELL#OPEN开头,并>=SELL#OPEN#430,因此基本上我试图以430或更高的价格
{
id: 'apples',
createdAt: 'some date'
rate: 430,
side: 'SELL',
status: 'OPEN',
GSI1: 'SELL#OPEN#430'
GSI2: 'apples'
}
我想使用GSI2的GSI属性作为散列进行查询,GSI1作为范围。
我要找的查询是getall apples(GSI2),其中GSI1以SELL#OPEN开头,并>=SELL#OPEN#430
,因此基本上我试图以430或更高的价格出售所有苹果,并且是开放的。
请问如何使用dynamodb查询进行此操作
我所做的是:
params = {
TableName: process.env.ORDERS_TABLE_NAME,
IndexName: "GSI2_GSI1",
KeyConditionExpression: `GSI2 = :item and ((begins_with(GSI2, :sideStatus) and >= :baseRate)`,
ExpressionAttributeValues: {
":item": `apple`,
":baseRate": `SELL#OPEN#${rate}`,
":sideStatus": "SELL#OPEN",
},
};
谢谢您只能对关键条件表达式中的关键属性进行操作。这些参数应该满足您的需要,因为您在GSI1属性中拥有所有信息
params = {
TableName: process.env.ORDERS_TABLE_NAME,
IndexName: "GSI2_GSI1",
KeyConditionExpression: 'GSI2 = :item and GSI1 BETWEEN :lower AND :upper',
ExpressionAttributeValues: {
":item": `apple`,
":lower": `SELL#OPEN#430`,
":upper": "SELL#OPEN#999", // you can probably also use "SELL#OPEN$" because $ is the character following # in ascii order
},
};
注意:这假设GSI1属性中的速率保留0填充。您需要按照与数字相同的顺序对字符串进行排序,因此如果速率为10,则需要存储SELL#OPEN#010。(注意,根据最大速率,您可能需要更多的前导0。)您的GSIs的键是什么?密钥条件表达式只能引用密钥属性(分区和排序密钥)。GSI密钥是示例中命名的GSI1和GSI2