标签: dynamodb-queries

如何在 DynamoDB 中按数组(或嵌套对象)中的元素进行过滤

我的数据如下:

[
  {
    orgId: "ABC",
    categories: [
      "music",
      "dance"
    ]
  },
  {
    orgId: "XYZ",
    categories: [
      "math",
      "science",
      "art"
    ]
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

例如,我有主键orgId,我想使用 DynamoDBquery过滤和返回类别为“科学”的项目。

(类别不需要是任何索引的一部分:我愿意接受额外的工作人员开销,前提是我可以在 Dynamo 本身内进行查询。)

我有一段时间让这个工作。categories如果这有帮助,我可以很容易地更改为嵌套对象吗?

但是 DynamoDB 中的比较运算符如此有限,以至于似乎无法按数组元素或嵌套对象进行过滤?

如果没有,这里更好的方法是什么?将每个类别变成它自己的第一级属性,例如:

[
  {
    orgId: "XYZ",
    category_math: true,
    category_science: true
  }
]
Run Code Online (Sandbox Code Playgroud)

肯定不是?

amazon-dynamodb dynamodb-queries

4
推荐指数
1
解决办法
6058
查看次数

具有另一个对象列表的对象的 DynamoDB Mapper 注释

我正在尝试为以下情况创建一个 dynamoDBMapper 注释。

我有 EmployeeLevelTrail,它是一个员工级别记录的类

@DynamoDBTable(tableName = TABLE_NAME)
public class EmployeeData {
    public final static String TABLE_NAME = “EmployeeDataRecord”;

    @DynamoDBAttribute(attributeName = “employeeID”)
    public String EmployeeID;

    @DynamoDBAttribute(attributeName = “EmployeeLevelDataRecords”)
    @DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.M)
    public EmployeeLevelTrail employeeLevelTrail

}


public class EmployeeLevelTrail {

    public final static String DDB_ATTR_EMPLOYEE_LEVEL_TRAIL = “employeeLevelTrail”;

    @DynamoDBAttribute(attributeName = DDB_ATTR_EMPLOYEE_LEVEL_TRAIL)
    private List<EmployeeLevelRecord> thisEmployeeLevelRecords;

    public void appendEmployeeLevelRecord(@NonNull EmployeeLevelRecord employeeLevelRecord) {

        thisEmployeeLevelRecords.add(employeeLevelRecord);

    }
}


public class EmployeeLevelRecord {

    private String Level;

    private String Manager;

    private Instant timeOfEvent;

}
Run Code Online (Sandbox Code Playgroud)

这是我的注释,但它不正确,因为我无法保存我的 DynamoDB 数据

annotations amazon-web-services amazon-dynamodb aws-sdk dynamodb-queries

4
推荐指数
2
解决办法
1万
查看次数

DynamoDB 扫描辅助索引 (GSI)

我正在阅读有关 Scan 的文档,它的前言是:

Scan 操作通过访问表或二级索引中的每个项目来返回一个或多个项目和项目属性。1

这让我想知道,在什么情况下扫描二级索引会返回与普通表返回的一组不同的记录?

Scan 不支持 KeyConditionExpression,仅支持 FilterExpression - 这基本上发生在检索数据之后。

那么扫描 GSI 与表的含义是什么?

amazon-web-services amazon-dynamodb secondary-indexes dynamodb-queries

4
推荐指数
1
解决办法
4554
查看次数

DynamoDB:从主键获取所有排序键

我有一个带有主键和排序键的表;由于这是一个复合键,因此我有多个主键映射了不同的排序键。

如何获取与特定主键关联的所有排序键?

我尝试使用“获取”操作,但这似乎也需要排序键(即使这些是我正在寻找的)。我还查看了“BatchGet”操作,但这是针对多个不同的键,而不是针对具有多个不同排序键的单个主键。

我也尝试过“查询”,但没有成功,但我对此了解较少,所以这可能是解决方案 - 是这样吗?我还知道我可以“扫描”整个数据库并专门查找具有该特定主键的所有项目,但我希望尽可能避免这种情况。

我正在使用 JS 并将其用作参考:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

谢谢你!

amazon-dynamodb dynamodb-queries

4
推荐指数
1
解决办法
5130
查看次数

如何在更新时从 DynamoDB 中删除多个属性

我想从 DynamoDB 表中的项目中删除两个属性。在文档和互联网上的任何地方,它都显示仅删除一个属性。是否可以从 DynamoDB 表中的一个项目中一次删除多个属性。如果是这样,怎么办?下面是我尝试过的代码:

const params = {
  TableName: process.env.REPORTS_TABLE,
  Key: {
    ReportId: removeParams.reportId
  },
  UpdateExpression: 'REMOVE #param1, #param2',
  ExpressionAttributeValues: { '#param1': 'StartDate', '#param2': 'EndDate' },
  ReturnValues: 'UPDATED_NEW'
};
const res = await updateReport(params);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValidationException: ExpressionAttributeValues contains invalid key: Syntax error; key: "#param2"
Run Code Online (Sandbox Code Playgroud)

这是AWS的限制还是有其他方法可以做到这一点?

amazon-web-services node.js amazon-dynamodb dynamodb-queries

4
推荐指数
1
解决办法
1万
查看次数

Dynamodb 什么是 WCU 和 RCU?

即使读了很多文章,我仍然无法理解WCU和RCU的含义。Dynamo 提供以下免费套餐:

  • 25 个预配置写入容量单元 (WCU)
  • 25 个预配置读取容量单元 (RCU)

“每秒 25 次读写”是什么意思?我有一个带有 API 的 Web 应用程序,可以从 Dynamo 读取数据。这是否意味着它每秒只能处理 25 个查询和写入?如果是的话,如果我们在一秒钟内收到 26 个读请求会发生什么?

我很困惑,希望能通过使用网络应用程序的真实示例进行解释。

amazon-web-services amazon-dynamodb dynamodb-queries

4
推荐指数
1
解决办法
9112
查看次数

我们可以更新 DynamoDB GSI 分区键吗?

根据文档,我了解 PrimaryKey PK 和 SortKey SK 无法在主表上更新。然而,这对于 GlobalSecondaryIndex (GSI) 来说并不清楚,更新 GSI SK 似乎可以(如果我错了,请纠正我)。

假设我有以下帐户表,其中我们有以下 PK (ID) + SK (createdAt)

id     createdAt     email          username
21     20220101      abc@xyz.com    blah1
22     20220102      123@xyz.com    blah2
...
Run Code Online (Sandbox Code Playgroud)

如果我想通过电子邮件建立索引,我可以创建一个 GSI,其中电子邮件是 PK,createdAt 是 SK。

我们如何处理允许用户更改电子邮件或用户名的情况?

  • 这本质上是另一个分区中的新主键,因此是 GSI 表中的新行吗?
  • 这是否意味着 GSI 中的旧行可能已过时?如果是这样,如果我们无法直接在 GSI 上删除,DynamoDB 是否会清理旧条目?

amazon-dynamodb dynamodb-queries

4
推荐指数
1
解决办法
1896
查看次数

根据表dynamodb python中的存在更新或插入项目

问题

我正在尝试逐项查看表,这样如果某个项目已经存在,那么我应该能够更新它,如果不存在,那么我应该能够插入它。

但是,我了解到更新的工作方式也类似于 upsert(update/insert) 。我的情况也不适合这个。

我的情况

  1. 检查item表中是否存在并存储flag(布尔值)
  2. 检查是否flag0(项目不可用),然后插入该项目并将当前时间戳添加到列中Inserted_dttm
  3. 检查是否flag1(项目可用),然后更新项目并将当前时间戳添加到列中Updated_dttm(而不是 Inserted_dttm)

试用

我一直在寻找query()是一个不错的选择get_item(),但是您的解决方案都受到欢迎。

def lambda_handler(event, context):
    x = TrainDataProcess()
    file_name = 'Training_data/' + event['file_name']
    s3.Object(bucket_name, file_name).download_file('/tmp/temp.xlsx')
    table_name = 'training_data'

    x.load_excel(name='/tmp/temp.xlsx')
    x.load_headers(skiprows=0)
    x.data_picking()

    table = dynamoDB_client.Table(table_name)
    load = x.return_records_json()

    try:
        with table.batch_writer() as batch:
            for record in load:
                flag = table.query(TableName=table_name, )
                if flag == 0:
                    record['inserted_dttm'] = get_dttm()
                    batch.put_item(Item=record)
                elif flag == …
Run Code Online (Sandbox Code Playgroud)

python amazon-dynamodb boto3 aws-lambda dynamodb-queries

3
推荐指数
1
解决办法
5526
查看次数

在 Golang 中查询 DynamoDB 上的二级索引

我的主键是一个名为“id”的字段

我在“group_number”字段上的表中添加了二级索引

在此处输入图片说明

我通过二级索引查询,如下所示:

// Query the secondary index
queryInput := &dynamodb.QueryInput{
    TableName: aws.String(c.GetDynamoDBTableName()),
    KeyConditions: map[string]*dynamodb.Condition{
        "group_number": {
            ComparisonOperator: aws.String("EQ"),
            AttributeValueList: []*dynamodb.AttributeValue{
                {
                    S: aws.String(c.GroupNumber),
                },
            },
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

然而; 我收到错误“validationexception:查询条件缺少关键架构元素:id”

DynamoDB 是否只允许查询主键?我的印象是您使用“GetItem”作为主键,因为如果您使用主键,则只有一条记录可以返回。要通过二级索引进行搜索,请使用“查询”,要通过非索引键进行搜索,请使用“扫描”。

请让我知道我在这里做错了什么。

go amazon-dynamodb dynamodb-queries amazon-dynamodb-index

3
推荐指数
1
解决办法
3598
查看次数

AWS Local DynamoDB 请求中包含的安全令牌无效

我是 AWS 的新手,我正在尝试从 Java 程序对本地 DynamoDB 执行 CRUD 操作。Java 程序是一个 AWS 示例。

我安装了 AWS CLI 并设置了以下配置 - 根据 AWS 文档,我不需要本地 DynamoDB 的真正 AWS 访问和密钥。

我通过在 AWS CLI 中运行 aws configure 在 ~/.aws/config 和 ~/.aws/credentials 中设置了以下值。

[default]
aws_access_key_id = ''
aws_secret_access_key = ''
[default]
region = ap-south-1
Run Code Online (Sandbox Code Playgroud)

我有运行这个的本地 DYnamoDB JAR。

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

我试图运行的代码是这样的。

https://github.com/aws-samples/aws-dynamodb-examples/blob/master/src/main/java/com/amazonaws/codesamples/datamodeling/ObjectPersistenceCRUDExample.java

然而,我收到了这个异常。

AmazonDynamoDBException:请求中包含的安全令牌无效。

完整的堆栈是这样的。

    Exception in thread "main" com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The security token included in the request is invalid. (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: …
Run Code Online (Sandbox Code Playgroud)

java amazon-dynamodb dynamo-local dynamodb-queries

3
推荐指数
1
解决办法
2969
查看次数