【问题标题】:How to count the number of times the userid is present in Dynamodb如何计算用户 ID 在 Dynamodb 中出现的次数
【发布时间】:2020-11-29 16:11:33
【问题描述】:

我创建了一个 amazon lex 聊天机器人,可以为组织提高票证。它要求 5 个输入字段(empid、name、description、impact、urgency、emailid)并存储在 aws lambda 中。到目前为止,我一直在通过 python 中的 aws lambda 将从聊天机器人获得的输入字段存储到 dynamodb 中。现在,我想检查特定用户提出票证的次数。我是数据库概念的初学者。

对话示例。

User:Hi   
Chatbot:Enter your id?   
User:q123    
Chatbot:enter your name?   
User:xxx    
Chatbot:enter your desc?       
User:sdbsb       
Chatbot:enter your emailid?         
User:xxx@yyy.com     
Chatbit:your ticket is raised.       
User:I want to check till now the number of tickets I have raised     
Chatbot:you have raised 4 tickets till now.

示例代码:

import json
import logging
import re
import http.client
import mimetypes
import boto3

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)


def close():
    val=  {
             "dialogAction":
            {
                "fulfillmentState":"Fulfilled",
                "type":"Close",
                "message":
                 {
                     "contentType":"PlainText",
                     "content":"Hey your ticket has been raiised"
                 },
                'responseCard': {
                'version': '1',
                'contentType': 'application/vnd.amazonaws.card.generic',
                
                    }
                }
    print(val)
    return val


def lambda_handler(event, context):
  
    dynamodb=boto3.resource('dynamodb')
    table=dynamodb.Table('employee')
    slots = event['currentIntent']['slots']

    empidemployee= event['currentIntent']["slots"]["empidemployee"]
    latestdesc= event['currentIntent']["slots"]["latestdesc"]
    latestservice= event['currentIntent']["slots"]["latestservice"]
    latestimpactvalue= event['currentIntent']["slots"]["latestimpactvalue"]
    latesturgency= event['currentIntent']["slots"]["latesturgency"]
    basicinfo=event['currentIntent']["slots"]["basicinfo"]
    
    jsonStrings ={
            'empidemployee':empidemployee,
            'desc':latestdesc,
            'service':latestservice,
            'impact':latestimpactvalue,
            'urgency':latesturgency,
            'emailid':basicinfo
            
        }
    print(jsonStrings)

    table.put_item(
        Item=jsonStrings
        )

    
    val=close()
    return val
    return {
        'statusCode':200,
        'body':'added'
    }

【问题讨论】:

  • 你的表定义是什么样的?您是如何定义主键的?

标签: python aws-lambda amazon-dynamodb aws-lex


【解决方案1】:

您没有向我们提供有关您的表结构的任何信息,因此很难提供具体建议。

使用 DynamoDB 时,了解应用程序的访问模式至关重要。例如,您似乎具有以下访问模式:

  • 按用户取票
  • 按用户获取票数

您可能还具有以下访问模式:

  • 按用户获取 OPEN 票证
  • 按用户获取 CLOSED 票证

可能有:

  • 获取所有用户的所有 OPEN 票证
  • 获取所有用户的所有 CLOSED 票证

DynamoDB 可以轻松支持这些访问中的每一个,但您需要设计如何存储数据以支持每种访问模式。在关系数据库中,存储 User 和 Ticket 信息就足够了,因为您可以使用 SQL 来执行 ad-hoc 查询:

select count(*) from tickets where user_id = "q123"

但这不是 DynamoDB 的工作方式。

您能否详细说明您的访问模式和您当前的表格设计?

更新

您描述了员工和工单之间的一对多关系。您的主要访问模式包括获取每个用户的票证和计算每个用户的票证数量。为了支持这些访问模式,我将表格设计如下(为简洁起见,我省略了一些字段):

此表显示两个员工。员工 1234 有 3 张工单。员工 5678 有 1 张工单。

我已经对一些我想提请您注意的概念进行了颜色编码。蓝色框是 Employee 分区。员工分区包含工单项目的集合(以绿色突出显示)和员工个人资料(以红色突出显示)。

在员工资料中,我包含了一个 num_tickets 属性。插入/删除工单时,您可以添加/减去该数字。因此,您始终可以通过抓取员工的个人资料来获取当前计数。

几个示例查询(伪代码):

  • 获取员工票:PK = EMPLOYEE#<id> AND BEGINS_WITH(SK, 'TICKET')
  • 获取员工资料:PK = EMPLOYEE#<id> AND SK = PROFILE

如果您是 DynamoDB 新手,其中大部分内容可能听起来令人困惑。与使用关系数据库相比,DynamoDB 需要一种非常不同的思维方式。您如何构建数据对于支持您的访问模式至关重要

我会强烈推荐查看Alex DeBries talk on DynamoDB data modeling。他很有天赋,能够以一种非常容易理解的方式解释复杂的 DynamoDB 数据建模主题。

【讨论】:

  • 我很抱歉没有提供所需的信息。我想获取用户提出的票数,无论是开放票还是封闭票。我将在一个当我提出票时,outllook 来自第三方网站的电子邮件。
  • 您能描述一下您的餐桌设计吗?你的主键是什么?你在使用排序键吗?
  • 非常感谢。我是 db 的新手,刚开始使用 dynamodb 时有点困惑。这对我来说真的非常有用。再次感谢!!!
  • 学习新技术可能会让人不知所措。像 DynamoDB 这样的 NoSQL 数据库完全与其对应的关系数据库不同。您需要建立一些基础知识才能将所有部分组合在一起。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多