我想使用 boto3 检查 DynamoDB 表中有多少条目与查询匹配,而不检索实际条目。
我想对 DynamoDB 表中的数据运行机器学习作业。我正在训练的数据是回答查询的数据,而不是整个表。仅当我有足够的数据进行训练时,我才想运行该作业。因此,我想检查是否有足够的条目与查询匹配。值得一提的是,我正在查询的 DynamoDB 表非常大,因此除非我确实想运行该作业,否则无法进行实际检索。
我知道我可以用来获取整个表boto3.dynamodb.describe_table()中有多少条目,但正如我之前提到的,我只想知道有多少条目与查询匹配。
有任何想法吗?
amazon-web-services python-3.x amazon-dynamodb boto3 dynamodb-queries
我一直在四处走动,但不清楚该怎么做。
我有一个简单的表,我想在其中对几列进行查询。据我了解,这意味着为要查询的每一列创建二级索引。我已经使用Serverless框架定义了表,serverless.yml并且收到了各种奇怪的错误消息。
当前的serverless.yml定义是:
resources:
Resources:
MessagesDynamoDBTable:
Type: 'AWS::DynamoDB::Table'
Properties:
AttributeDefinitions:
- AttributeName: messageId
AttributeType: S
- AttributeName: room
AttributeType: S
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: messageId
KeyType: HASH
- AttributeName: userId
KeyType: RANGE
LocalSecondaryIndexes:
- IndexName: roomIndex
KeySchema:
- AttributeName: room
KeyType: HASH
Projection:
ProjectionType: "KEYS_ONLY"
- IndexName: userId
KeySchema:
- AttributeName: userId
KeyType: HASH
Projection:
ProjectionType: "KEYS_ONLY"
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:custom.tableName}
Run Code Online (Sandbox Code Playgroud)
它的意思是类似于Slack服务-因此我想查询房间,用户等的条目。
根据我已经找到的文档,此定义很有意义。一个应该为索引中使用的列声明属性,而我已经这样做了。KeySchema-我确实只需要messageId字段,但是一条错误消息表明它需要RANGE索引,因此我将userId字段添加到KeySchema中只是为了关闭它。根据我已经找到的文档,二级索引字段看起来正确。
有了这个定义,当尝试使用 serverless deploy
An error occurred: …Run Code Online (Sandbox Code Playgroud) amazon-dynamodb serverless-framework dynamodb-queries amazon-dynamodb-index
我在DynamoDB中有一个包含如下属性的表:
OrderId,OrderJson,OrderStatus.
订单状态的值可以是0或1.我需要能够更新指定订单的状态,还可以根据状态字段获取订单.其中一个选项是使用扫描,另一个选项是使用状态为分区键的辅助索引,但状态字段具有较小的值范围.请建议描述要求的最佳做法是什么?谢谢!
我是noSQL数据建模的新手,所以如果我的问题不重要,请原谅。我在dynamodb中发现的一个建议是在查询时始终提供“ PartitionId”,否则它将扫描整个表。但是在某些情况下,我们需要列出我们的商品,例如在ecom网站上,我们需要在列表页面上列出我们的产品(带有分页)。
我们应该如何通过避免扫描或有效使用来执行此列表?
所以基本上我有一个 array( ) 并想从 a中features执行upsert操作。该数组看起来像这样:。现在这里更新按预期发生,但插入没有发生。dynamodbforEach-loopfeatures[{'feature': 'existing_feature', 'visibility': ['should_update']}, {'feature': 'new_feature', 'visibility': ['should_insert']} ]
update(table, params) {
const query = {
...params,
TableName: this.tableName(table)
}
console.log('update-query', query)
return this._docClient.update(query).promise()
}
updateSupportTierDetails(features) {
console.log('inside updateSupportTierDetails')
const promises = []
features.forEach(element => {
const params = {
Key: {
'feature': element.feature
},
UpdateExpression: 'set visibility = :visibility',
ExpressionAttributeValues: {
':visibility': element.visibility
},
ReturnValues: "UPDATED_NEW"
}
console.log('updateSupportTierDetails params', params)
const promise = this.update('features', params)
console.log('promise', promise) …Run Code Online (Sandbox Code Playgroud) 我有一个这样的项目
{
"date": "2019-10-05",
"id": "2",
"serviceId": "1",
"time": {
"endTime": "1300",
"startTime": "1330"
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的设计方式是这样的:
primary key --> id
Global secondary index --> primary key : serviceId
--> sort key : date
Run Code Online (Sandbox Code Playgroud)
按照我现在的设计方式,
* I can query the id
* I can query serviceId and range of date
Run Code Online (Sandbox Code Playgroud)
我希望能够查询以便检索所有项目
* serviceId = 1 AND
* date = "yyyy-mm-dd" AND
* time = {
"endTime": "1300",
"startTime": "1330"
}
Run Code Online (Sandbox Code Playgroud)
我仍然希望能够根据前面的 2 个条件进行查询(按 id 查询,以及按 serviceId 和 rangeOfDate 查询
有没有办法做到这一点?我想的一种方法是创建一个新字段并将其用作索引,例如:合并所有数据,以便合并字段:“1_yyyy-mm-dd_1300_1330 …
database database-design nosql amazon-dynamodb dynamodb-queries
我正在尝试从 DynamoDB 表中删除数据。
如果我使用分区键删除数据,它会起作用。
但是当我使用任何其他字段删除多行时,它会失败。
var params = {
TableName: "test",
Key: {
dmac: dmac,
},
ConditionExpression: "dmac= :dmac"
};
docClient.delete( params, (error) => {
if (error) {
console.log( "Delete data fail" );
} else {
console.log( "Delete data Success" );
}
});
Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js amazon-dynamodb dynamodb-queries
我的 DynamoDB 结构如下。
我只创建了一张 DynamoDB 表,因为所有 aws dynamodb 文档都表明如果可能的话仅使用一张表是最佳解决方案。所以我最终得到以下结果:

在此表中,ID 是分区键,EntryType 是排序键。每项索赔和付款都有其所有者。我的访问模式如下:
我可以通过两个全局二级索引来实现这些。我可以使用 GSI(以 EntryType 作为分区键、以 CreationDate 作为排序键)列出按创建日期排序的患者、索赔和付款。此外,我还可以使用另一个具有 EntryType 分区键和 OwnerID 排序键的 GSI 来列出患者的索赔和付款。
我的问题是这种方法只能对创建日期进行排序。我的患者和索赔有更多的属性(每个属性大约 25 个),我还需要根据每个属性对它们进行排序。但 Amazon DynamoDB 有一个限制,即每个表最多可以有 20 个 GSI。因此,我尝试动态创建 GSI(根据请求动态创建),但效率也非常低,因为它将项目复制到另一个分区来创建 GSI(据我所知)。那么,按患者姓名、按索赔说明以及他们拥有的任何其他字段对患者进行排序的最佳解决方案是什么?
我有一个使用无服务器框架创建的表:
resources:
Resources:
withdawlRequestTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:provider.environment.WITHDRAWAL_REQUEST_TABLE}
AttributeDefinitions:
- AttributeName: pk
AttributeType: S
- AttributeName: sk
AttributeType: S
KeySchema:
- AttributeName: pk
KeyType: HASH
- AttributeName: sk
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
GlobalSecondaryIndexes:
- IndexName: sk-pk-index
KeySchema:
- AttributeName: sk
KeyType: HASH
- AttributeName: pk
KeyType: RANGE
Projection:
ProjectionType: ALL
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
Run Code Online (Sandbox Code Playgroud)
我现在尝试使用运算符查询该表begins_with,但我不断收到此错误:
INFO ValidationException: Invalid KeyConditionExpression: Incorrect operand type for operator or function; operator or function: begins_with, operand type: M …Run Code Online (Sandbox Code Playgroud) 我们有一个 Dynamodb 表,Events其中包含大约 5000 万条记录,如下所示:
{
"id": "1yp3Or0KrPUBIC",
"event_time": 1632934672534,
"attr1" : 1,
"attr2" : 2,
"attr3" : 3,
...
"attrN" : N,
}
Run Code Online (Sandbox Code Playgroud)
有Partition Key=id并且没有Sort Key。id除了(全局唯一)和 之外,可以有数量可变的属性event_time,这是必需的。
此设置非常适合获取,id但现在我们希望有效地查询event_time并提取在该范围内匹配的记录的所有属性(可能是一百万或两个项目)。例如,标准将等于WHERE event_date between 1632934671000 and 1632934672000。
在不更改任何现有数据或通过外部过程转换数据的情况下,是否可以使用event_date和投影允许范围查询的所有属性来创建全局二级索引?根据我对 DynamoDB 的理解,这是不可能的,但也许还有我忽略的另一种配置。
提前致谢。
amazon-dynamodb ×10
dynamodb-queries ×10
node.js ×3
boto3 ×1
database ×1
nosql ×1
python-3.x ×1