php - 如何扫描 DynamoDB 以查找列表中的文本?

标签 php amazon-dynamodb dynamodb-queries

在 DynamoDB 中,我有一个具有以下结构的表。
actions“字段”包含所有信息(这是我要搜索的字段),orderId 是主键

{
  "actions": [
    {
      "actionDescription": "8f23029def1d6baa4",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533730680,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "21857e61037bc29ec",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731788,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "cf10abd44e24cef56",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731788,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "7787fe7a5bf4d22de",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731789,
      "user": {
        "fullName": "OOOOOO",
        "userName": "ooooo@oooo.ooo",
      }
    },
    {
      "actionDescription": "9528c439021f504bf",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731789,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "bfba100e0e54934b2",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731789,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "f789dc12f1dbe3be2",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731789,
      "user": {
        "fullName": "OOOOOO",
        "userName": "ooooo@oooo.ooo",
      }
    },
    {
      "actionDescription": "4cd6b68dfea7cf8ee",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731789,
      "user": {
        "fullName": "XXXXX",
        "userName": "xxxxx@xxxx.xxx",
      }
    },
    {
      "actionDescription": "1e3a0e95f8e5106d7",
      "actionTitle": "UNDEFINED_ACTION",
      "timestamp": 1533731790,
      "user": {
        "fullName": "OOOOOO",
        "userName": "ooooo@oooo.ooo",
      }
    }
  ],
  "orderId": "13aae31"
}

我想做的是使 PHP 中的扫描词能够通过 userName 进行搜索。或通过 Action 数组中的任何字段(时间戳、 Action 标题等)。
下面是我尝试使用的众多术语之一,但我无法取得任何结果

$params = [
 'TableName'                 => $this->tableName,
 'FilterExpression'          => "userName = :searchTerm",
 'ExpressionAttributeValues' => [
     ':searchTerm' => 'ooooo@oooo.ooo',
  ],
 'ReturnConsumedCapacity'    => 'TOTAL',
];
$results = $this->dynamoDbClient->scan($params);

你能告诉我我缺少什么来指导我吗?
另外,请注意:我不想获取特定的 orderId,我想获取包含 searchTerm 的所有 orderId(在本例中为 userName)

最佳答案

使用此项目架构的最佳选择是自己过滤表格项目。也就是说,扫描没有过滤表达式的表,自己写代码过滤结果。没有过滤器表达式的扫描将消耗相同数量的读取容量单位。

您可以将过滤器表达式设置为类似这样的内容,但是这是不可扩展的,并且仅当操作列表中的项目数量固定时才有效。

  actions[0].user.userName == :searchTerm OR actions[1].user.userName == :searchTerm OR actions[2].user.userName == :searchTerm OR ....

如果您需要复杂的搜索功能,您最好使用专用的搜索数据库。 AWS 围绕这个提供了两种服务,AWS CloudSearch 和 AWS ElasticSearch。您可以使用 DynamoDB 流来使您的搜索索引保持最新。

如果您设置为使用过滤器扫描 DynamoDB 表,您可以重构您的结构以包含额外的属性,这些属性在一个集合(或连接的字符串)中包含所有可搜索信息

{
  "actions": [....],
  "actionsDescriptions": Set["8f23029def1d6baa4", "21857e61037bc29ec", "cf10abd44e24cef56", "7787fe7a5bf4d22de", "9528c439021f504bf", "bfba100e0e54934b2", "f789dc12f1dbe3be2", "4cd6b68dfea7cf8ee", "1e3a0e95f8e5106d7"],
  "actionTitles": Set["UNDEFINED_ACTION"],
  "timestamps": Set[1533730680, 1533731788, 1533731789, 1533731790],
  "user_fullNames": Set["XXXXX"],
  "user_userNames": Set["ooooo@oooo.ooo", "xxxxx@xxxx.xxx"],
  "orderId": "13aae31"
}

请注意,您必须使用集合(或将所有值连接成一个字符串),因为 contains 函数仅适用于字符串和集合。

然后你可以使用这样的过滤器表达式

contains(user_userNames, :searchTerm)

关于php - 如何扫描 DynamoDB 以查找列表中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51747297/

相关文章:

python-3.x - BatchGetItem 操作 : "The provided key element does not match the schema" 上的 DynamoDB 和 Boto3 错误

php - 获取 "Integrity constraint violation: 1048 Column ' payment_id' cannot be null"using Doctrine & Symfony

php - php数组的结果是[value][value],我怎样才能得到像[value,value]这样的结果

python-3.x - PynamoDB 支持 AWS DAX 吗?

javascript - 如何在本地使用 GlobalSecondaryIndexes 在 DynamoDB 上创建表?

javascript - DynamoDB 中的正向和反向分页

php - 如何使用 php 提取或解压缩 gzip 文件?

php - 表单转sql表列

c# - 如何使用对象持久性模型在 C# 中动态更改 dynamodb 表名

java - DynamoDB (Java) 中基于数字限制和偏移的分页