Python 如何计算用户ID出现在Dynamodb中的次数

Python 如何计算用户ID出现在Dynamodb中的次数,python,aws-lambda,amazon-dynamodb,aws-lex,Python,Aws Lambda,Amazon Dynamodb,Aws Lex,我创建了一个amazon lex聊天机器人,为该组织提高了票数。它需要5个输入字段(empid、name、description、impact、emergency、emailid)并存储在aws lambda中。到目前为止,我一直在通过python中的aws lambda将从chatbot获得的输入字段存储到dynamodb中。现在,我想检查一个特定用户提交了多少次罚单。我是数据库概念的初学者 对话样本 User:Hi Chatbot:Enter your id? User:q123

我创建了一个amazon lex聊天机器人,为该组织提高了票数。它需要5个输入字段(empid、name、description、impact、emergency、emailid)并存储在aws lambda中。到目前为止,我一直在通过python中的aws lambda将从chatbot获得的输入字段存储到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'
    }

您尚未向我们提供有关表结构的任何信息,因此提供具体建议很有挑战性

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

  • 按用户获取票据
  • 按用户获取票证数
您还可能具有以下访问模式:

  • 按用户获取打开的票证
  • 按用户获取已关闭的票据
你可能会:

  • 获取所有用户中所有打开的票证
  • 获取所有用户中所有已关闭的票证
DynamoDB可以轻松地支持这些访问,但是您需要设计如何存储数据以支持每个访问模式。在关系数据库中,存储用户和票据信息就足够了,因为您可以使用SQL执行特殊查询:

select count(*) from tickets where user_id = "q123"
但DynamoDB不是这样工作的

您能详细介绍一下您的访问模式和当前的表设计吗

更新

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

此表显示两名员工。1234员工有3张票。员工5678有一张票

我用彩色编码了一些概念,希望引起大家的注意。蓝色框是员工分区。员工分区包含一组票证项目(以绿色突出显示)和一个员工档案(以红色突出显示)

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

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

  • 获取员工票证:
    PK=Employee#并以(SK,'TICKET')开头。
  • 获取员工档案:
    PK=Employee#和SK=Profile
如果您是DynamoDB的新手,这听起来可能会让人困惑。DynamoDB需要一种与使用关系数据库截然不同的思维方式。如何构造数据对于支持访问模式至关重要


我强烈建议大家观看。他有一种天赋,能够以非常容易理解的方式解释复杂的DynamoDB数据建模主题。

您的表定义是什么样的?您是如何定义主键的?很抱歉没有提供所需的信息。我想获取用户提交的票证数量,而不管它是开放票证还是封闭票证。当我提交票证时,我将从第三方网站的outllook电子邮件中获取随机票证数量。您能描述一下您的情况吗桌子设计?你的主键是什么?你在使用排序键吗?非常感谢。我刚开始在db工作,刚开始使用dynamodb时有点困惑。这对我来说真的很有用。再次感谢!!!学习一项新技术可能会让人不知所措。像DynamoDB这样的NoSQL数据库与它们的关系数据库完全不同。你需要建立一些基础知识,把所有的部分放在一起。祝你好运