如何计算userid在Dynamodb中出现的次数

How to count the number of times the userid is present in Dynamodb

我创建了一个 amazon lex 聊天机器人,可以为组织提出问题。它需要 5 个输入字段(empid、名称、描述、影响、紧急程度、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'
    }

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

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

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

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

  • 按用户获取 OPEN 票
  • 获取用户关闭的工单

而你可能有:

  • 获取所有用户的所有 OPEN 工单
  • 获取所有用户的所有已关闭工单

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

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

但这不是 DynamoDB 的工作方式。

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

更新:

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

此 table 显示了两名员工。员工 1234 有 3 张工单。员工 5678 有 1 张工单。

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

在员工资料中,我包含了一个 num_tickets 属性。当inserting/deleting一张票时,你可以add/subtract那个号码。因此,您始终可以通过获取员工的个人资料来获取当前计数。

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

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

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

我会高度推荐观看Alex DeBries talk on DynamoDB data modeling。他有以一种非常易于理解的方式解释复杂的 DynamoDB 数据建模主题的天赋。