当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda和Dynamo db:如何通过多个参数过滤扫描结果?

夏侯英纵
2023-03-14

我是AWS和Dynamo的新手。我正在使用React.js前端和AWS(Gateway API、Lambda、Dynamo)后端进行我的项目。这是我的应用位置:

https://www.alphaux.com

单击“获取提示”后,我收到服务器响应。如果我单击一个关键字-这些关键字将添加到请求的GET参数列表中,如:topic=blah

以下是我的问题的详细信息:

在我的Lambda中:…const docClient=new AWS.DynamoDB。DocumentClient({region:'us-west-2});出口。处理程序=异步(事件)=

GET我收到以下参数:

const topicName = event.queryParams.topic="React";
const keywords = event.queryParams.topic.keywords="blah1,blah2,blah3";

...这里的一些代码将关键字字符串转换为数组:

const keywordsArray=[blah1, blah2, blah3];

在Dynamodb中,它们以以下方式存在:

[ { "S" : "javascript" }, { "S" : "programming" }, { "S" : "React" } ]

我的主要分区键是:id(Number)

我尝试了不同的方式和方法,使用扫描和查询-什么都不起作用。我卡住了。我尝试了以下方法:

const listToObjectMappings = () => {
    let x = {};
    /* keywords hardcoded for now: */
    const keywords = ["javascript", "React"]; 
    keywords.map(item => x[':' + item] = item)
    return x
}
let mappings = listToObjectMappings()
let joined = Object.keys(mappings).join();

var params2 = {
        TableName : "my-little-table",
        FilterExpression: 'topic = :topic and #keywords IN (' + joined + ')',
            ExpressionAttributeNames: {
              '#keywords' : 'keywords'
        },
        ExpressionAttributeValues:{
            ":topic" : "React"
        }
};
 var params = {
    TableName: "my-little-table",
    FilterExpression: "#topic = :topic",
    ExpressionAttributeNames: {
      "#topic": "topic"
    },
    ExpressionAttributeValues: {
      ":topic": "React"
    }
  };

    let result;
    try {
        /* scan DB */
        result = await docClient.scan(params).promise();
    }
    catch(ex) {
        result = ex;
    }  

当我使用“扫描”时,如果我试图使用“关键字”,结果总是空的[]。它仅适用于以下最小值:

    const params = {
        TableName : currentTable,
        FilterExpression:'topic = :topic',
        ExpressionAttributeValues:{
            ":topic" : requestedTopic
        }
    };

..这给了我基于请求主题的所有记录。

如果我使用“查询”,它会抱怨我的键名(“id”)太短,必须至少有3个字符长。

我被困住了,优雅地请求你的帮助!非常感谢。

共有1个答案

魏雅惠
2023-03-14

如果您试图匹配主题和任何一个关键字,请使用以下内容:

const params = {
  TableName: 'mytable',
  FilterExpression: '#tp = :tp AND (contains(#kw, :kw1) OR contains(#kw, :kw2))',
  ExpressionAttributeNames: {
    '#tp': 'topic',
    '#kw': 'keywords',
  },
  ExpressionAttributeValues: {
    ':tp': 'React',
    ':kw1': 'react',
    ':kw2': 'react-router',
  },
};

如果您试图匹配主题和所有关键字,请使用以下内容:

const params = {
  TableName: 'mytable',
  FilterExpression: '#tp = :tp AND contains(#kw, :kw1) AND contains(#kw, :kw2)',
  ExpressionAttributeNames: {
    '#tp': 'topic',
    '#kw': 'keywords',
  },
  ExpressionAttributeValues: {
    ':tp': 'React',
    ':kw1': 'react',
    ':kw2': 'react-router',
  },
};
 类似资料:
  • 我必须构建一个Android应用程序,用于读取一种设备上的信息,该设备仅在过滤时在扫描时显示(一般扫描不会显示它)。该设备类似于信标,因此它仅通告数据,这些数据在通告上具有我想要的信息(它不可连接)。制造商给我的过滤器是原始数据。即: 0x02010612435542 我不能按名称过滤它,因为设备不会宣传它的名称。我也不能通过来完成,因为应用程序以前不会知道设备的地址(这将是许多此类设备)。 nr

  • 第一篇文章是关于Stack的,对于使用Python和DynamoDB编程来说,这是相当新的,但是我只是想在我的表上运行一个扫描,根据两个预定义的属性返回结果。 ---这是我的Python代码片段--- 我的发电机有4个磁场。 ID 日期 班次 安全 现在关于这个问题,在运行时,我得到了两个返回的表条目,而我应该只得到第一个条目...根据我的扫描标准,有“没有安全问题”的那个。 ---这是我的Dyn

  • 我正在Android上使用BluetoothLe(最小API: 21)。目前过滤服务uuid的过程有效,但不完全如预期的那样。下面是用于设置基本扫描仪参数的代码段,这是目前有效的。基于Ble的其他工作领域,(iOS,嵌入式硬件)很明显,有能力仅根据其16位UUID分配来过滤Ble设备。这让我想到Android...我意识到android对Ble及其相当细分的设备生态系统有一个相当艰难的开始,但我不

  • 我试图子集一个熊猫DataFrame在python基于两个逻辑语句 即。 但是第3行的语法无效。 有没有一种方法可以在一行中完成?

  • 问题内容: 我正在做熊猫分析。 我的表有700万行* 30列。单元格值的范围从-1到3随机。现在,我想根据列的值过滤掉行。 我了解如何根据多个条件进行选择,写下条件并通过“&”“ |”组合。 但是我有30列要过滤,并按相同的值过滤。例如,需要选择最后12列的值等于-1 上面的代码给了我一个布尔值。我需要实际的数据框。 这里的逻辑是“或”,表示如果任何列的值为-1,则需要选择该行。另外,很高兴知道我

  • 问题内容: 是否可以通过多个值过滤对象数组? 例如,在下面的示例中,我可以按term_ids 5和6进行过滤,然后同时键入car吗? 如果可以轻松使用,肯定可以使用库。 问题答案: 您可以使用Array.filter