查找列表字段包含 dynamodb 中的值的所有项目

mar*_*ark 5 java amazon-dynamodb

我是 DynamoDb 的新手,我正在努力弄清楚如何做到这一点(使用 java sdk)。

我目前有一个用于通知的表(在 mongo 中)。架构基本上如下(我已经简化了)

id: string
notifiedUsers: [123, 345, 456, 567]
message: "this is a message"
created: 12345678000 (epoch millis)
Run Code Online (Sandbox Code Playgroud)

我想迁移到 Dynamodb,但我无法找出选择在特定日期之后发送给特定用户的所有通知的最佳方法?

我发现我不能在像notifiedUsers这样的列表上有索引,因此在这种情况下我不能使用查询 - 这是正确的吗?

我不想扫描然后过滤,可能会有很多记录。

有没有办法使用查询或其他方法来做到这一点?

编辑这就是我现在正在尝试的,它不起作用,我不知道该把它带到哪里(如果有的话)。

Condition rangeKeyCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.CONTAINS.toString())
    .withAttributeValueList(new AttributeValue().withS(userId));

if(startTimestamp != null) {
  rangeKeyCondition = rangeKeyCondition.withComparisonOperator(ComparisonOperator.GT.toString())
      .withAttributeValueList(new AttributeValue().withS(startTimestamp));
}

NotificationFeedDynamoRecord replyKey = new NotificationFeedDynamoRecord();
replyKey.setId(partitionKey);

DynamoDBQueryExpression<NotificationFeedDynamoRecord> queryExpression = new DynamoDBQueryExpression<NotificationFeedDynamoRecord>()
    .withHashKeyValues(replyKey)
    .withRangeKeyCondition(NOTIFICATIONS, rangeKeyCondition);
Run Code Online (Sandbox Code Playgroud)

mar*_*ark 2

为了防止其他人遇到这个问题,最后我们扁平化了模式,这样现在每个 userId 都有一条记录。这会导致问题,因为 dynamoDb 无法自动批量写入记录。使用原始模式,我们有一条记录,并且可以自动写入它,以确保所有用户都收到该通知。现在我们无法确定,这正在造成痛苦。