我正在使用以下代码通过 DynamoDB 查询进行查询和分页:
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)
def run(date: int, start_epoch: int, end_epoch: int):
dynamodb = boto3.resource('dynamodb',
region_name='REGION',
config=Config(proxies={'https': 'PROXYIP'}))
table = dynamodb.Table('XYZ')
response = table.query(
# ProjectionExpression="#yr, title, info.genres, info.actors[0]", #THIS IS A SELECT STATEMENT
# ExpressionAttributeNames={"#yr": "year"}, #SELECT STATEMENT RENAME
KeyConditionExpression=Key('date').eq(date) & Key('uid').between(start_epoch, end_epoch)
)
for i in response[u'Items']:
print(json.dumps(i, cls=DecimalEncoder))
while 'LastEvaluatedKey' in response:
response = table.scan( ##IS THIS INEFFICIENT CODE?
# ProjectionExpression=pe,
# FilterExpression=fe,
# ExpressionAttributeNames=ean,
ExclusiveStartKey=response['LastEvaluatedKey'] …Run Code Online (Sandbox Code Playgroud) 我想使用aws-sdk 在 dynamodb 中使用分页DocumentClient()
我正在使用 node.js。
我想要做的是获取前 10 个项目,然后将这些值返回给用户。在该用户发出新请求之后,他告诉服务器从 10 开始,服务器从 10 到 20 获取其他 10 并返回响应。我已经尝试过LastEvaluatedKey但我的情况不同。有什么方法可以告诉 dynamodb 从特定的 Item 例如 1 开始,然后设置Limit: 10.
我有一个名为 products 的表。它的架构是
我想查询类似于
SELECT * FROM products WHERE CustomerNumber IN ("cust123","cust234").
Run Code Online (Sandbox Code Playgroud)
如何实现?
很少观察 -
DynamoDBQueryExpression 将只查询索引/hashKey,而不是像上面的例子那样查询 hashKeys 列表。
此外,DynamoDBQueryExpression 不支持 IN 、 OR 运算符。
此外,BatchLoad 仅使用主键(在我的情况下为 customerNumber 和 productID)记录来返回一批记录。
另外,我不想扫描表格并对其应用过滤器。
同样在 customerNumber 上创建 GSI 然后查询它不起作用
我试图在社交网络的 nosql db 模型中遵循“一张表”原则。但它给我带来了很多问题。
假设我的模型现在看起来像这样:
Table-Groups
{
name: "Group1"
topics: [
name: "Topic1"
posts: [
{
id: "tid1"
author: "Walter White"
message: "Hello from Post1"
comments: [
{
id: "cid1"
author: "Jessy"
message: "Yo nice post Mr. White"
}
{
id: "cid2"
author: "Saul"
message: "Jeze Walt"
}
]
}
//... Many other posts here
]
//... Many other topics within the group
]
}
//... Not so many other groups
Run Code Online (Sandbox Code Playgroud)
我可以对帖子或评论数组进行分页吗?
因为我会(理论上)在 post 数组中有很多帖子,所以我必须阅读大量数据,而实际上我只想阅读最新的 10 个帖子。帖子中的数组评论也是如此。有没有可能对这些数组进行分页?
我可以将主题数组中的属性“name”用作 sortKey 吗?(topic.name) …
我的问题可能类似于以下问题
如何查询介于开始日期和结束日期之间的条目 - DynamoDB,
但我认为在我的要求和我正在寻找的内容方面有所不同。
对于特定的分区键值,我想查询当前日期位于开始日期和结束日期之间的所有记录。
我的用例是会创建调查。每个调查都有一个名称并属于一个类别。每个调查都有一个开始日期和结束日期。我需要查询给定类别的所有活动调查的名称,即当前日期位于开始日期和结束日期之间的类别的所有调查。此外,调查可以是活动的/非活动的。
到目前为止做了什么:
表设计:表 tbl_surveys
分区键:tbl_pk_surv
排序键:tbl_sk_surv
一个“数据”属性:data_attr
我使用tbl_sk_surv 作为分区键和data_attr 作为 Sortkey创建了一个GSI。
我为每个调查创建 2 条记录:
tbl_pk_surv |tbl_sk_surv|data_attr|cat_name|start_date|end_date|status
Surv-0tOrClRnTz| SURVEY | Survey1 | Cat1 |1564012800|1564876799|1
tbl_pk_surv | tbl_sk_surv | data_attr| survey_name | status
Surv-0tOrClRnTz | Cat1 | 1564012800-1564876799 | Survey1 | 1
所以我将 startdate 和 enddate 放在第二条记录的 1 列中。我的计划是,我想查询 GSI 分区键值“Cat1”,并获取“Cat1”的所有调查名称。请让我知道如何查询 GSI 排序键值 1564012800-1564876799,以便我可以在开始日期和结束日期之间进行查询。
请注意,我放置了第一条记录,静态值“SURVEY”作为 pk_sk_surv 属性的值,以便我可以通过使用“SURVEY”作为分区键值查询 GSI 来查询所有调查记录。我正在尝试实现单表 no-sql 设计。
我是 NoSql Design 的新手,请指导我如何为我的需求建模数据和查询。
我有两列定义的表,第 1hash key列是 ,第 2 列是range key. 我想获得使用相同哈希键定义的所有项目(因此范围键无关紧要)。
我尝试使用new KeyPair().withHashKey(k). 但它会抛出异常说no RANGE key value present。
我唯一的选择是对表格进行扫描以实现这一目标吗?
我希望能够在考虑限制之前使用查询操作过滤分页结果。是否有任何建议可以在过滤后的结果上获得正确的分页?
我想使用以下逻辑实现 DynamoDB 扫描或查询:
Scanning -> Filtering(boolean true or false) -> Limiting(for pagination)
Run Code Online (Sandbox Code Playgroud)
但是,我只能使用以下逻辑实现扫描或查询:
Scanning -> Limiting(for pagination) -> Filtering(boolean true or false)
Run Code Online (Sandbox Code Playgroud)
注意:我已经尝试过全局二级索引,但在我的情况下它不起作用,因为我有 5 个不同的属性要过滤和限制。
我是DynamoDB的新手,任何人都可以帮我在DynamoDB中使用JOIN吗?我使用无服务器框架和映射模板.我有POST和USER表. POST有userId字段.如何获得有关用户信息的所有帖子?在MYSQL中,我可以使用JOIN但它在DynamoDB中如何工作?我读了2年前创建的stackoverflow中的帖子.而且有人写道,它不可用.也许事情发生了变化......?
amazon-web-services amazon-dynamodb serverless-framework dynamodb-queries
我正在建立一个房地产网站,其中包含房产列表、一些搜索过滤器和一个带有自动完成功能的地址字段。它工作正常,但自动完成的性能非常慢。几乎需要一秒钟才能得到回应。考虑到所有服务都在我所在的地区,我认为这很慢。
我即兴进行了一种“模糊”搜索,我在其中拆分了源字符串(例如,如果用户搜索“Jumeirah, Rimal”变为 [“jumeirah”, “rimal”])并尝试匹配某个位置的完整“路径”(一个像 locationID/city/community/sub-community/tower 这样的字符串,在这个例子中是“are.1.50/Dubai/Jumeirah Beach Residence/Rimal”)到分割字符串的每个部分。表达式变成这样:
contains(#path, :fullString) OR
(contains(#path, :stringOne) AND contains(#path, :stringTwo) AND ... )
Run Code Online (Sandbox Code Playgroud)
重要的是,因为我需要使用“包含”运算符,所以我不能用 KeyExpression 有效地完成它,我需要使用较慢的 FilterExpression 进行完整扫描。我只有 7,500 个位置可供搜索,而且性能已经很差了。
这让我思考是否应该使用像 Aurora 这样的基于 SQL 的数据库。AFAIK SQL 可以非常高效地执行复杂的查询。
我还将研究 AWS 的弹性搜索解决方案。
你怎么认为?
amazon-web-services amazon-dynamodb amazon-aurora dynamodb-queries
我有一个 Dynamo 表,其中只有分区键 - “CreatedAt”和一些其他属性。
我想写一个查询,但我不会得到结果。CreatedAt 位于 LastSunday 和 Today 之间的项目的数量。
我已将日期以字符串格式存储为“2021-03-09T14:33:29Z”。
我不想使用 GSI。
使用以下查询时,我收到错误 - “不支持查询关键条件”
这是我的代码:
var queryRequest = new QueryRequest
{
TableName = myTableName,
KeyConditionExpression = "CreatedAt BETWEEN :LastMonday AND :TodaysDate",
};
Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
expressionAttributeValues.Add(":TodaysDate", new AttributeValue { S = "2021-03-09T14:33:29Z" });
expressionAttributeValues.Add(":LastMonday", new AttributeValue { S = "2021-03-02T14:33:29Z" });
queryRequest.ExpressionAttributeValues = expressionAttributeValues;
var response = await awsDynamoClient.QueryAsync(queryRequest);
Run Code Online (Sandbox Code Playgroud) 如果项目(状态)不存在,我将调用此函数来放置项目,这是我从这里引用的内容:How do I Conditionally insert an item into a dynamodb table using boto3 ..
def put_items_if_doesnt_exist():
dynamodb = boto3.resource('dynamodb',region_name='us-east-1')
try:
table = dynamodb.Table('awssolutions-ssm-hybrid-table')
response = table.put_item(
Item={
'name':'Execution',
'state': 'Locked',
},
ConditionExpression='attribute_not_exists(state) AND attribute_not_exists(name)'
)
except ClientError as e:
# Ignore the ConditionalCheckFailedException
if e.response['Error']['Code'] != 'ConditionalCheckFailedException':
raise
Run Code Online (Sandbox Code Playgroud)
这里的问题是状态是保留字,因此它失败并出现错误:
[ERROR] ClientError: An error occurred (ValidationException) when calling the PutItem operation: Invalid ConditionExpression: Attribute name is a reserved keyword; reserved keyword: state
Run Code Online (Sandbox Code Playgroud)
有什么建议来处理这个问题吗?
python amazon-web-services amazon-dynamodb boto3 dynamodb-queries
amazon-dynamodb ×11
dynamodb-queries ×11
.net ×1
aws-appsync ×1
boto3 ×1
c# ×1
node.js ×1
nosql ×1
python ×1