【问题标题】:Looking for the most efficient/cost effective way to query my DynamoDB table寻找最有效/最具成本效益的方式来查询我的 DynamoDB 表
【发布时间】:2021-12-31 23:22:17
【问题描述】:

在我的网站上,我有一个包含以下字段的表单:全名、电子邮件、电话号码和消息(下图)。

有人填写表格后,我想查询我的表以查看是否有任何项目具有相同的电子邮件地址或用户提供给表格的电话号码。如果有一个项目具有相同的电子邮件/电话号码,那么我想检索该项目的“sharedID”,然后使用提交的表单信息以及检索到的 id 在表中创建一个新项目。

目前,我正在执行 dynamoDB 查询来实现这一点(代码如下)。但是,我相信我需要在查询中包含主键(id)。但是,这是一个问题,因为在查询时无法知道项目的 id(因为 id 是随机生成的)。

const checkForSameEmailOrPhone = () => {

const params = {
 TableName: "customers",
 ProjectionExpression: "sharedID",
 FilterExpression: "email_address = :givenEmail or phone_number = :givenNumber",
 ExpressionAttributeValues: {
     ":givenEmail": "xample@example.com",
     ":givenNumber": '7777777'
 }
};

docClient.query(params, function(err, data){
   if (err) {
     console.error('Error in GetItem', err);
   } else {
     console.log('data', data);
     function createItem() {
       const uniqueId = nanoid();
         let params = {
             TableName :"customers",
             ConditionExpression: "attribute_not_exists(z)",
             Item:{
               "id": uniqueId,
               "email_address": "address@email.com",
               "full_name": "a name",
               "phone_number": "822222222",
               "message": "different",
               "sharedId": data?.Items[0]?.id || uniqueId
             }
         };
         docClient.put(params, function(err, data) {
             if (err) {
               console.error('sdk ERROR', err);
             } else {
               console.log('success');
             }
         });
     };
     createItem();
   }
});
};

话虽如此,我想知道是否有人可以帮助我找到一种经济高效的解决方案来检索包含用户在表单上提供的相同电子邮件和电话号码的项目的 ID。

【问题讨论】:

    标签: javascript amazon-web-services amazon-dynamodb dynamodb-queries


    【解决方案1】:

    您应该创建全局二级索引并将您要查询的字段用作分区键。一个表可以有多个 GSI,最佳做法是只将必要的字段添加到索引中(因此在查询数据时使用较少的读取容量单位)。 您可以在官方documentation中阅读更多关于索引的信息

    【讨论】:

    • 我相信你是对的。我试图在 1 个查询中查询特定的电话号码/电子邮件地址,但是我相信我需要进行 2 个单独的查询。话虽如此,我相信我需要 2 个 GSI。一个带有 email_address 和 sharedID,另一个带有 phone_number 和 sharedID。让我知道这是否有意义?
    • 让我知道 ^ 是否有意义,@Caldazar
    • @ChrisRose 是的,如果您在两者中都需要 sharedID,那么您肯定需要分开索引来进行查询。您可以做的是使用其中之一进行查询(例如带有 sharedID 的电话号码),然后使用电子邮件过滤结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    相关资源
    最近更新 更多