Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何使用AWS DynamoDB的并行扫描在特定GSI上运行扫描?_Amazon Web Services_Amazon Dynamodb_Dynamodb Queries_Amazon Dynamodb Index_Secondary Indexes - Fatal编程技术网

Amazon web services 如何使用AWS DynamoDB的并行扫描在特定GSI上运行扫描?

Amazon web services 如何使用AWS DynamoDB的并行扫描在特定GSI上运行扫描?,amazon-web-services,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-index,secondary-indexes,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Index,Secondary Indexes,我有一个DynamoDB表,其中每个项都有一个名为“DataType”的键。 此外,此表上还有一个GSI,其中“数据类型”作为哈希键,“时间戳”作为rangeKey 大约10%的表项的“数据类型”值为“A” 我想用固定为“A”的哈希键扫描此GSI的所有项目。有没有办法使用扫描/并行扫描来执行此操作?或者我需要对GSI本身使用查询来执行此操作吗 根据文件, 我找不到任何方法来指定一个GSI,在该GSI上我可以使用HashKey fixed进行扫描。鉴于您只想查看具有Hash key“a”的项目,

我有一个DynamoDB表,其中每个项都有一个名为“DataType”的键。 此外,此表上还有一个GSI,其中“数据类型”作为哈希键,“时间戳”作为rangeKey

大约10%的表项的“数据类型”值为“A”

我想用固定为“A”的哈希键扫描此GSI的所有项目。有没有办法使用扫描/并行扫描来执行此操作?或者我需要对GSI本身使用查询来执行此操作吗

根据文件,


我找不到任何方法来指定一个GSI,在该GSI上我可以使用HashKey fixed进行扫描。

鉴于您只想查看具有Hash key“a”的项目,您需要使用查询API而不是扫描API,提供索引名,并查询索引中具有该分区键的项目

下面是一些使用的示例代码,它使用全局二级索引(称为
GSI1
)在表中创建三个项。其中两个项目的
GSI1PK
值为
“橙色”
,而另一个项目的
GSI1PK
值为
“金色”
。查询返回两个匹配项:

    const tableName = getFromEnv(`TABLE_NAME`);
    const client = new DynamoDBClient({});

    async function createItem(
        name: string,
        PK: string,
        SK: string,
        GSI1PK: string,
        GSI1SK: string,
    ): Promise<void> {
        const item = { PK, SK, GSI1PK, GSI1SK, name };
        const putCommand = new PutItemCommand({
            TableName: tableName,
            Item: marshall(item)
        });
        await client.send(putCommand);
        log(`Created item: ${name} with GSI1PK ${GSI1PK}`);
    }

    await createItem(`foo`, `fooPK`, `fooSK`, `orange`, `blue`);
    await createItem(`bar`, `barPK`, `barSK`, `orange`, `white`);
    await createItem(`baz`, `bazPK`, `bazSK`, `gold`, `garnet`);

    log(`Waiting 5 seconds, as GSIs don't support consistent reads`)
    await wait(5);

    const query: QueryCommandInput = {
        TableName: tableName,
        IndexName: `GSI1`,
        KeyConditionExpression: `#pk = :pk`,
        ExpressionAttributeNames: {
            '#pk': `GSI1PK`,
        },
        ExpressionAttributeValues: {
            ':pk': { S: `orange` },
        },
    }

    const result = await client.send(new QueryCommand(query));
    log(`Querying GSI1 for "orange"`);
    result.Items.forEach((entry) => {
        log(`Received: `, unmarshall(entry).name);
    });

从这个例子中值得注意的一点是,GSI不允许一致读取。因此,如果您的用例需要即时一致性,您需要找到另一种解决方案。

可以扫描GSI,AWS文档中有:“(…)您可以在表上创建一个或多个二级索引,并针对这些索引发出查询或扫描请求”-感谢@AndresaMartins,确实可以对GSI进行扫描。然而,问题明确地表示它只想用“A”的哈希键来考虑项目,所以这里的扫描是不合适的。我更新了第一个句子,澄清了由于问题的需要而需要进行查询。
Created item: foo with GSI1PK orange
Created item: bar with GSI1PK orange
Created item: baz with GSI1PK gold
Waiting 5 seconds, as GSIs don't support consistent reads
Querying GSI1 for "orange"
Received:  foo
Received:  bar