DynamoDB从未返回预期结果开始

时间:2018-01-25 15:46:32

标签: node.js amazon-dynamodb

我正在使用NodeJS和DynamoDB。我之前从未使用过DynamoDB,主要是C#开发人员(这只是一个.Where(x => x...)调用,不知道为什么亚马逊会让它变得更加复杂。)我试图只是根据id是否以某些字符开头来查询表。例如,我们将年份作为Id字段的前2个字符。所以像这样:180192,所以年份是2018. 20部分是无关紧要的,只是想给出一个人类可读的例子。因此,Id以1817开头,我只想查询数据库中所有Id以18开头的行(例如,可能是17或其他)。我确实看过文档,我不确定我是否完全理解它,这是我到目前为止所返回的所有结果而不是预期的结果。

   let params = {
        TableName: db.table,
        ProjectionExpression: "id,CompetitorName,code",
        KeyConditionExpression: "begins_with(id, :year)",
        ExpressionAttributeValues: {
            ':year': '18'
        }
    return db.docClient.scan(params).promise();

所以你可以看到,我认为这将是一个begins_with电话,在那里我寻找对抗Id的18。但同样,这将返回所有结果(好像我根本没有KeyConditionExpression)。

很想知道我错在哪里。谢谢!

更新

所以我猜begin_with不起作用,因为它只适用于字符串而我的id不是字符串。根据评论者的建议,我可以使用BETWEEN,即使这也不起作用。我要么取回所有结果,要么Query key condition not supported错误(如果我使用.scan,我会收到所有结果,如果我使用.query我会收到错误)

这是我正在尝试的代码。

        let params = {
        TableName: db.table,
        ProjectionExpression: "id,CompetitorName,code",
        KeyConditionExpression: "id BETWEEN :start and :end",
        ExpressionAttributeValues: {
            ':start': 18000,
            ':end': 189999
        }
    };

return db.docClient.query(params).promise();

2 个答案:

答案 0 :(得分:0)

似乎没有实际的解决方案,我原本试图做的不幸。这是DynamoDB的巨大垮台。确实需要某种方式来使用列的值来“在哪里”,就像在几乎任何其他语言中一样。但是,我不得不承认,问题的一部分是id的结构方式。你不应该依赖id来获取信息。无论如何,我确实找到了另一个列DateofFirstCapture,它使用with contains(所有日期格式都不一样,这是一团糟)并且使用一年20182017似乎正在起作用。

答案 1 :(得分:0)

如果要按ID提取数据,请将其添加为分区键。如果要按字符串的一部分获取数据,则可以在排序键上使用“开头为”。

enter image description here

  

begins_with(a,substr)-如果属性a的值以特定的子字符串开头,则为true。

来源:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/Query.html