繁体   English   中英

获取项目列表(如SQL IN子句)

[英]Get a list of items (like a SQL IN clause)

我有一个项目表,其中每个项目都属于一个组织。 每个项目都有一个名称和一个自动生成的UUID。 该项目的名称在组织内应唯一。 因此,我将表定义如下:

{
  "AttributeDefinitions": [
    { "AttributeName": "orgId",            "AttributeType": "S" },
    { "AttributeName": "name",             "AttributeType": "S" },
    { "AttributeName": "id",               "AttributeType": "S" }
  ],
  "TableName": "symbols",
  "KeySchema": [
    { "AttributeName": "orgId", "KeyType": "HASH" },
    { "AttributeName": "name",  "KeyType": "RANGE" }
  ],
  "LocalSecondaryIndexes": [
    {
      "IndexName": "IdIndex",
      "KeySchema": [
        { "AttributeName": "orgId", "KeyType": "HASH" },
        { "AttributeName": "id",    "KeyType": "RANGE" }
      ],
      "Projection": {
        "ProjectionType": "KEYS_ONLY"
      }
    }
  ],
  "ProvisionedThroughput": {
    "ReadCapacityUnits": 10,
    "WriteCapacityUnits": 5
  },
  "SSESpecification": {
    "Enabled": true
  }
}

我正在尝试检索与指定ID列表匹配的项目集。 我的Java代码如下所示:

List<AttributeValue> attributeValueList = new ArrayList<>();
String[] idList = {"d329e1f8-9705-4ec2-95a9-135379e32090", "ddcc98e9-9a55-4c2c-b329-ed696b1bcc5c"};
for (String id : idList) {
    attributeValueList.add(new AttributeValue().withS(id));
}

HashMap<String, Condition> keyConditions = new HashMap<>();

keyConditions.put("orgId", new Condition()
        .withComparisonOperator(ComparisonOperator.EQ)
        .withAttributeValueList(new AttributeValue("111")));

keyConditions.put("id", new Condition()
        .withComparisonOperator(ComparisonOperator.IN)
        .withAttributeValueList(attributeValueList));

QueryRequest queryRequest = new QueryRequest()
        .withTableName(Symbol.TABLE_SYMBOL)
        .withKeyConditions(keyConditions)
        .withIndexName("IdIndex")
        .withSelect("ALL_ATTRIBUTES");

QueryResult queryResult = dynamoDB.query(queryRequest);

当我运行查询时,它给了我一个例外:

尝试的条件约束不是可索引的操作

有什么想法为什么不起作用? 我是否需要使用扫描? 如果可能的话,我想坚持查询。

对于任何尝试做类似事情的人,这都是有效的。

    List<AttributeValue> attributeValueList = new ArrayList<>();
    for (String id : objectIds) {
        attributeValueList.add(new AttributeValue().withS(id));
    }

    TextFragment partitionKey = new TextFragment();
    partitionKey.setOrgId(user.getOrgId());

    Condition rangeKeyCondition = new Condition();
    rangeKeyCondition.withComparisonOperator(ComparisonOperator.IN)
            .withAttributeValueList(attributeValueList);

    DynamoDBQueryExpression<TextFragment> queryExpression = new DynamoDBQueryExpression<TextFragment>()
            .withHashKeyValues(partitionKey)
            .withQueryFilterEntry("id", rangeKeyCondition);

    List<TextFragment> itemList = mapper.query(TextFragment.class, queryExpression);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM