【问题标题】:DynamoDB: Query to find an item in an array of stringsDynamoDB:查询以在字符串数组中查找项目
【发布时间】:2018-05-21 16:37:11
【问题描述】:

我可能不太了解哈希/主键在 DynamoDB 中的工作原理,但我正在尝试为消息传递服务创建一个模型(使用无服务器 + Dynagels/NodeJS)。

模型如下所示:

const ConversationORM = dynogels.define('Conversation', {

  hashKey: 'id',

  timestamps: true,
  tableName: config.CONVERSATION_TABLE,

  schema: {

    id: Joi.string(),
    users: Joi.array(), // e.g. ['foo', 'bar', 'moo']
    messages: Joi.array()

  }
})

如您所见,users 是一个数组,其中列出了对话参与者的 userId。

我需要创建一个服务来查找用户参与的所有对话。在 MongoDB(我更熟悉)中,我会执行以下操作:

Conversation.find({users: {"$in": ['foo']} }).then(.... 

我可以在 DynamoDB 中做一些等效的事情吗?这是一个经常发生的 API 调用,所以我希望尽可能提高它的效率。

【问题讨论】:

    标签: node.js amazon-dynamodb dynogels


    【解决方案1】:

    此答案考虑了对 Hunter Frazier 回答说您不想使用 Scan 的评论。

    当使用Query 时,您需要在操作中指定单个分区键。在您的架构中,这意味着对 userid 属性进行分区,这是一个集合。 DynamoDB 中的分区键必须是顶级标量属性。由于 userid 不是标量(它是一个集合),因此您不能将此属性用作索引,因此您不能对用户参与的对话进行查询。

    如果您需要执行此查询,我建议您重新访问您的架构。具体来说,我建议实现Adjacency list pattern,它在包含多对多关系的数据库中运行良好。

    您可以在上面的文章中看到我在此答案DynamoDB M-M Adjacency List Design Pattern上写的一些附加说明

    在你的情况下,你会:

    • 主键:ConversationID
    • 排序键:用户 ID
    • GSI 主键:用户 ID

    然后您可以在查询中使用 GSI 主键来返回用户参与的所有对话。

    【讨论】:

      【解决方案2】:

      我不熟悉 Dynogels 或 Serverless,但如果它使用常规 API,这可能会起作用:

      var params = {
          ExpressionAttributeNames: {
              "U": "users"
          },
          ExpressionAttributeValues: {
              ":a": {
                  S: "John Doe"
              }
          },
          FilterExpression: "Author = :a",
          ProjectionExpression: "#U",
          TableName: "Conversations"
      };
      dynamodb.scan(params, function (err, data) {
          if (err) console.log(err, err.stack);
          else console.log(data);
      });
      

      【讨论】:

      • 有没有办法在没有全面扫描的情况下做到这一点?根据我的阅读,它们是昂贵的操作,这将是一个非常常见的端点,因此完全扫描并不理想。
      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 2011-08-17
      • 2015-07-20
      • 2020-10-04
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      相关资源
      最近更新 更多