我正在尝试使用分区键和排序键查询 dynamodb 表。排序键是一个 unix 日期,所以我想在排序的这两个日期之间请求 x 分区键。我目前可以通过表扫描来实现这一点,但为了速度优势,我必须将其移动到查询中。我无法在网上找到任何使用分区键和排序键来查询表的人的体面示例。
我已仔细阅读此https://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#DynamoDB.Query并了解我的参数必须在 KeyConditionExpression 内。
我已经通读了https://github.com/aws/aws-sdk-go/blob/master/service/dynamodb/expression/examples_test.go并大致了解了它。但我就是找不到 KeyConditionExpression 的语法
我原以为是这样的:
keyCond := expression.Key("accountId").
Equal(expression.Value(accountId)).
And(expression.Key("sortKey").
Between(expression.Value(fromDateDec), expression.Value(toDateDec)))
Run Code Online (Sandbox Code Playgroud)
但这会抛出:
ValidationException: Invalid KeyConditionExpression: 运算符或函数的操作数类型不正确;运算符或函数:BETWEEN,操作数类型:NULL
我目前正在使用 Java 和 DynamoDB 来工作DynamoDBMapper。我看到当我们使用时DynamoDBQueryExpression我们可以使用PaginatedQueryListor QueryResultPage。如果我们使用其中任何一个,下面是我们必须使用的方法,
query method - returns a [PaginatedQueryList][1]
queryPage method - returns a [QueryResultPage][1]
Run Code Online (Sandbox Code Playgroud)
PaginatedQueryList说它会首先加载 1MB 的数据,如果我们迭代,那么它会在需要时加载下一页,而且这是分页的。但是关于QueryResultPage?它说正在加载 1MB 的数据。但如果我们迭代它呢?它会加载第二页还是只给我们 1MB 的数据?我找不到任何相关信息?并且QueryResultPage还给了我们LastEvaluatedKey但PaginatedQueryList不是。那么有没有一种方法可以进入,LastEvaluatedKey否则PaginatedQueryList如果我们需要获取该密钥,我们是否必须始终使用QueryResultPage?
并且也代替以下代码,
PaginatedQueryList<Data> data = dynamoDBMapper.query(Data.class, queryExpression);
Run Code Online (Sandbox Code Playgroud)
如果我们使用以下内容,
List<Data> data = dynamoDBMapper.query(Data.class, queryExpression);
data.size();
Run Code Online (Sandbox Code Playgroud)
它会加载数据库中找到的所有数据吗?如果我使用stream()而不是data.size()它会加载全部怎么办?
我来自SQL和MongoDB背景,并且确实想将DynamoDB用于新项目。到目前为止,这是可以忍受的。我将数据写入DynamoDB,并使用流神奇地将我的数据摄取到Elastic Search中进行搜索。它完成了我需要做的所有事情。
但是,现在我的位置是我想要直接从DynamoDB进行查询的数据。
受影响的实体是:
我正在使用我的付款服务,通过该服务可以发起,更新,审核和查询付款。使用以下属性创建付款:
使用DynamoDB,我希望能够进行以下查询:
以上各项的某种组合(例如“来自供应商aaaa-bbbb的拒绝付款”)。
遵循DynamoDB官方文档之后,我正试图设置Overloaded Global Secondary Indexs以解决该问题。
我现在还没有开始设置“付款”,因为这感觉很奇怪,但是我确实开始设计用于reportPeriods的键和索引,以便于掌握。这是我现在所拥有的:
主键是id,sort。我的计划是将相同的表用于报告期和付款,因为DynamoDB文档说您可以为整个应用程序使用定义明确的表(我将数据比这保持了一点隔离,并且每个微服务使用一个表)。
我承认保持冗余行的最新状态并通过许多字段进行查询会有开销,但是假设我可以进行维护(我仍然在质疑自己)...我的真正问题是...我我做对了吗?
我假设要查询的任何内容,都需要添加带有ID和正确的“ sort”字段的新行。例如,假设我们有一个ID为dddd-eeee的付款,属于供应商aaaaa-bbbb,状态为1。我假设要按供应商和状态查询此付款,我应该添加一个包含以下字段的附加项目:
那是对的吗?如果要按vendorId +状态IN(1,3)查询怎么办?
如果您有过载GSI的经验,请查看我到目前为止所做的一切,并让我知道我是否处在正确的轨道上,或者我是wayyyyy,wayyyyy,wayyyy并最好进行一些更改(快速),或者我要被搞砸了。您建议进行哪些更改?
amazon-web-services nosql amazon-dynamodb dynamodb-queries amazon-dynamodb-index
我想弄清楚我的 dynamodb 表中项目的大小或完整大小,以便我可以准确地预测我正在进行的项目的成本。
我知道对于读取的每 4kb 数据,它将使用 1RCU。所以现在 id 想找出每个条目或总表的大小。
我对这个查询不太走运,它返回 0 个项目
const { Items } = await this.dynamoDb.query({
TableName: 'exampleTableName',
IndexName: 'createdDateTime-index',
KeyConditionExpression: '#createdDateTime BETWEEN :fromDateTime AND :toDateTime AND #status = :status',
ExpressionAttributeNames: {
'#status': 'status',
'#createdDateTime': 'createdDateTime',
},
ExpressionAttributeValues: {
':fromDateTime': '2017-02-20T01:58:49.710Z',
':toDateTime': new Date().toISOString(),
':status': 'SUCCESS',
},
}).promise();
Run Code Online (Sandbox Code Playgroud)
我在数据库中有一项:
{
"id": "fa47003a-983a-4dc3-a87e-ace73ea7e451",
"createdDateTime": "2018-02-20T02:58:49.710Z",
"status": "SUCCESS"
}
Run Code Online (Sandbox Code Playgroud)
桌子:
aws dynamodb create-table \
--endpoint-url http://localhost:8000 \
--table-name exampleTableName \
--attribute-definitions \
AttributeName=id,AttributeType=S \
AttributeName=status,AttributeType=S \
AttributeName=createdDateTime,AttributeType=S \
--key-schema \
AttributeName=id,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=10 \
--global-secondary-indexes \
IndexName=createdDateTime-index,KeySchema=["{AttributeName=status,KeyType=HASH},{AttributeName=createdDateTime,KeyType=RANGE}"],Projection="{ProjectionType=ALL}",ProvisionedThroughput="{ReadCapacityUnits=10,WriteCapacityUnits=10}" …Run Code Online (Sandbox Code Playgroud) 我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于 GSI。
实际上,如果给定的属性(即 GSI 的哈希值)已经存在,我想使保存失败。
例如,在一个虚构的员工表中,“SSN”是哈希键,“EmployeeId”上有一个 GSI。这两个属性都必须是独一无二的。在保存员工时,我想确保表中没有使用“SSN”或“EmployeeId”。我可以为表的哈希值(即 SSN)执行此操作,但不能为 GSI 的哈希值执行此操作。
是否支持?我在文档中没有看到。
谢谢!
在课堂DynamoDBMapper.FailedBatch上,Map<String, List<WriteRequest>>未加工的物品包含什么?
重试此失败批次的最佳方法是什么?
在DynamoDB的文档中,它说:
在查询操作中,DynamoDB 按排序顺序检索项目,然后使用可能存在的
KeyConditionExpression任何项目处理这些项目FilterExpression。
和:
单个查询操作最多可以检索 1 MB 的数据。此限制在任何
FilterExpression应用于结果之前适用。
这是否意味着KeyConditionExpression在此 1MB 限制之前应用?
我正在使用 DynamoDB 和 NodeJS 在 UI 上登记一些对象。名单很长,而且因为DynamoDB可以扫描/查询在一次数据的最1MB,我已经决定要在前端我使用分页所以Previous和Next按钮从当前页面PAGINATE来回。
我的问题是我想Table X通过使用DynamoDB Query基于所选DynamoDB Index.
假设我刚刚获取了最初的 20 个结果 (0-20),所以点击下一步按钮我想获取结果:21-40 等等。此外,我想启用向后分页,因此当我在显示结果的页面上时:41-60,Back按钮将再次获取结果:21-40。
根据我的理解,DynamoDB 不支持数字偏移。
如何实现向后和向前分页?我是 DynamoDB 的新手,请帮助我。
我正在使用 Amplify 使用 dynamodb 的放大蓝图设置具有相应 lambda 的 dynamodb。
使用 KeyConditionExpression 等以“经典”方式访问 dynamodb 工作得很好,但今天我想尝试使用 PartiQL 代替 executeStatement,但我无法让它工作。
我已将“dynamodb:PartiQLSelect”权限添加到所有其他 dynamodb 权限所在的 cloudfront 模板,如下所示:
"Action": [
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:PartiQLSelect"
],
Run Code Online (Sandbox Code Playgroud)
并且我没有收到任何权限错误,所以我希望那部分没问题,但是即使没有添加该行,它也会返回相同的错误。
总是返回的错误是: ValidationException: Unexpected from source"
无论我尝试过什么,都无济于事。到目前为止,我的代码非常基本:
const dynamodb2 = new AWS.DynamoDB();
let tableName = "habits_sensors";
if(process.env.ENV && process.env.ENV !== "NONE") {
tableName = tableName + '-' + process.env.ENV;
}
app.get(path, function(req, res) {
let params = {
Statement: `select * from ${tableName}`
};
dynamodb2.executeStatement(params, (err, data) => …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-dynamodb aws-amplify dynamodb-queries partiql
amazon-dynamodb ×10
dynamodb-queries ×10
node.js ×2
aws-amplify ×1
aws-sdk ×1
go ×1
java ×1
javascript ×1
mapper ×1
nosql ×1
partiql ×1