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