I\xe2\x80\x99m 在 AWS 上使用 DynamoDB 构建数据库。
\n\n我使用变量 X 作为分区键,使用变量 Y 作为排序键。
\n\n我还有一个变量 Z,我需要它作为第二个排序键。
\n\n有没有办法做到这一点?
\n根据DynamoDB doc:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-nosql-design.html
"您应该在DynamoDB应用程序中维护尽可能少的表.大多数设计良好的应用程序只需要一个表."
但根据我的经验,由于分区键设计,你总是要做相反的事情.
让我们考虑下一个情况.我们有几个用户角色,例如"admin","manager","worker".管理员的常用工作流程是CRUD管理器数据,其中读取操作不是一个管理员而是所有管理员列表.同样是经理 - 他CRUD工人数据.对于这两种情况,我们只有两种关键用法:
当然,我们应该有统一分布的分区键(正如文档强调的那样),所以我们不能为它选择用户角色,应该使用用户ID.由于我们已经将分区键作为一个随机ID,因此我们根本不需要排序键,因为它根本不起作用 - 我们只使用分区键部分就可以访问一个用户.此时我们意识到用户ID就像CUD操作的魅力一样,但对于每个R操作,我们需要扫描所有表,然后按用户角色过滤结果,这是无效的.如何改进?非常自然 - 让每个用户类型都有自己的表!然后我们将从管理员API扫描管理员列表,从管理员列表扫描员工列表.
我使用DynamoDB差不多一年了,仍然无法得到它.对我来说,现实情况是,对于现实生活场景,排序键是你永远不能使用的东西(我唯一的真实情况是访问属于同一时间的两个不同类型用户的"协议"项,所以主键是{partion:"managerId",sort:"userId"},二级全局索引是{partition:"userId",sort:"managerId"}所以我可以有效地查询所有特定的经理协议列表或所有特定用户协议列表仅提供查询的相应管理器或用户ID.该方法在以下文档中讨论:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html).
我觉得我根本不理解这个概念.对于两个用户类型,只使用一个 DynamoDB表,提供示例的关键模式的有效方法是什么?
I'm trying to understand how to query a table in dynamo using the DataModel. But, I found two ways that seems to work and I can't find an explanation or documentation of what's happening or if there is any difference between them.
这样做的,我发现正在使用的任一方式Filter或KeyExpression + FilterExpression。有什么区别和正确的做法?
一些例子:
选项1:
-- 带索引和键
public async Task<List<T>> Find<T>(Guid id)
{
var query = new QueryOperationConfig
{
IndexName = "Table_Id_Index",
Filter = new QueryFilter("TableId", QueryOperator.Equal, id)
};
return await _dynamoDbContext
.FromQueryAsync<T>(query)
.GetRemainingAsync(); …Run Code Online (Sandbox Code Playgroud) 我有这个更新表达式:
{
"UpdateExpression": "SET #location = :location, #edited = :edited, #coordinates = :coordinates, #city = :city, #country = :country, #zipCode = :zipCode, #street = :street, coordinates = :coordinates",
"ExpressionAttributeValues": {
":location": "Reston, VA",
":edited": true,
":coordinates": {
"lat": 38.9586307,
"lng": -77.35700279999999
},
":city": "Reston",
":country": "US",
":zipCode": "20190",
":street": "11910 Market St"
},
"ExpressionAttributeNames": {
"#location": "location",
"#edited": "edited",
"#coordinates": "coordinates",
"#city": "city",
"#country": "country",
"#zipCode": "zipCode",
"#street": "street"
}
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个奇怪的错误
ERROR: ValidationException: Invalid UpdateExpression: Two document paths overlap …Run Code Online (Sandbox Code Playgroud) 我在 DynamoDB 上遇到了这个奇怪的问题,我似乎无法更新项目。
这是我的命令:
TableName: 'UserTable',
Key: { UID: { S: 'h4XJj3YRxZiF7TDcGkxAhc' } },
UpdateExpression: 'SET numRatings = :numRatings',
ExpressionAttributeValues: { ':numRatings': { N: 336 } },
ReturnValues: 'UPDATED_NEW'
Run Code Online (Sandbox Code Playgroud)
我已经验证该表是正确的,并且表 UID 的键确实具有哈希值h4XJj3YRxZiF7TDcGkxAhc作为值。numRatings目前等于1。
这是我的代码:
const params = {
TableName: process.env.USER_TABLE_NAME!,
Key: {
UID: {
S: UID
}
},
UpdateExpression: 'SET numRatings = :numRatings',
ExpressionAttributeValues: {
':numRatings': { N: numRatings } as unknown as AttributeValue
},
ReturnValues: 'UPDATED_NEW'
} as UpdateItemCommandInput;
try {
const result = await dbClient.send(new …Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services amazon-dynamodb typescript dynamodb-queries
我已经看过 PartiQL 语法的 dynamoDB 文档:
SELECT expression [, ...]
FROM table[.index]
[ WHERE condition ] [ [ORDER BY key [DESC|ASC] , ...]
Run Code Online (Sandbox Code Playgroud)
但在实践中:
select * from dev .pk-all-index
where "pk" = 'config' AND ("brand" = 'tesla' OR contains("aliases", 'tesla.com'))
Run Code Online (Sandbox Code Playgroud)
给我错误:
执行命令期间发生错误。ValidationException:语句格式不正确,无法处理:意外的关键字
amazon-dynamodb dynamodb-queries amazon-dynamodb-index partiql
如何使用扫描操作查询dynamoDb中仅包含"Tue"的对象(workingDays)键的数组,我使用过滤器表达式查询但是我没有得到任何结果.
var queryData = {
TableName: tableName,
FilterExpression: "contains (workingDays, :dayVal)",
ExpressionAttributeValues: {
":dayVal": {
S:"Tue"
}
}
};
console.log("getParams ==>", queryData)
dynamodb.scan(queryData, function (err, details) {
if (err) {
console.log(err, err.stack); // an error occurred
callback(err, null)
}
else{
callback(null, details)
}
})
Run Code Online (Sandbox Code Playgroud) 我想为例如博客网站设计一个 DynamoDB 表,其中每个表post可以包含零到三个“标签”(类似于 Stack Overflow 在发布之前可以包含的关键字/标签)。访问模式是posts通过tag1、tag2和/或获取所有内容tag3。如果有区别的话,数据接口层是 Graphql via Appsync via Amplify >_<)
Dynamo 能否有效支持这种访问模式?我一直读到 Dynamo 在涉及过滤的访问模式方面表现不佳;但是,我不确定这种访问模式是否可以在 Dynamo 中实现而不依赖于过滤。
如果 Dynamo 无法有效支持这种访问模式,是否有一些推荐的替代方案?例如,如果 Aurora 是更好的解决方案,那么Dynamotags中将与 Aurora 结合什么设计模式?poststags
确定所有标签的有效方法是什么?例如,react-select它是一个用于构建需要可能值数组的标签选择组件的简洁工具。有没有办法跟踪此类元数据?
假设我有这样的 DynamoDB 表,并Order ID作为主键。:
Order ID每次我添加/放置新项目时,都会增加一。
现在,我有一个数字,比方说,我的用户想要获取所有具有>1000的项目。因此返回的项目将为、、、 等等,直到最后一项。Order ID 1000100110021003
我的要求就像看起来一样简单 - 但这件事可以用QueryAWS DynamoDB 的方法来做吗?
感谢任何帮助:) 谢谢!
我正在尝试使用分区键和排序键查询 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
dynamodb-queries ×10
.net ×1
aws-lambda ×1
aws-sdk-net ×1
c# ×1
go ×1
javascript ×1
partiql ×1
typescript ×1