Node.js DynamoDB从没有返回预期结果开始

Node.js DynamoDB从没有返回预期结果开始,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,我正在使用NodeJS和DynamoDB。我以前从未使用过DynamoDB,主要是一个C开发者(这只是一个。where(x=>x…)调用,不知道为什么亚马逊会让它变得更复杂)。我只是尝试根据id是否以某些字符开头来查询表。例如,我们将年份作为Id字段的前两个字符。比如说:180192,那么今年是2018年。20部分无关紧要,只是想给出一个可读的示例。因此,Id以18或17开头,我只想查询db中Id以18开头的所有行(例如,可以是17或其他)。我确实看了文档,但我不确定我是否完全理解它,这里是我到

我正在使用NodeJS和DynamoDB。我以前从未使用过DynamoDB,主要是一个C开发者(这只是一个
。where(x=>x…
)调用,不知道为什么亚马逊会让它变得更复杂)。我只是尝试根据id是否以某些字符开头来查询表。例如,我们将年份作为
Id
字段的前两个字符。比如说:
180192
,那么今年是2018年。
20
部分无关紧要,只是想给出一个可读的示例。因此,Id以
18
17
开头,我只想查询db中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();
如您所见,我认为这将是一个以调用开始的
调用,在该调用中,我根据Id查找18。但同样,这将返回所有结果(好像我根本没有KeyConditionExpression)

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

更新

因此,我猜
begin_with
不起作用,因为它只对字符串起作用,而我的id不是字符串。根据评论者的建议,我可以在
之间使用
,即使这样也不起作用。我返回所有结果或
查询不支持的关键条件
错误(如果我使用
.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();

看来,对于我原本想做的事情,似乎没有真正的解决办法。这是DynamoDB的一个巨大的崩溃。确实需要有一些方法来使用列的值来执行“where”,就像在几乎任何其他语言中一样。然而,我必须承认,部分问题在于
id
的结构。你不应该依赖id来获取信息。无论如何,我确实找到了另一个专栏
DateofFirstCapture
,它使用了with-contains(所有日期的格式都不一样,太乱了),使用年份
2018
2017
似乎很有效

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

以(a,substr)开始\u-如果属性a的值以特定子字符串开始,则为true


来源:

ID字段是字符串还是数字?我相信它是一个数字,我没有访问模式的权限,但是查看我们在parseInt(ID)中传递的其余代码所以我在猜数字。我尝试传递
18
而不是
'18'
,但我得到了以下错误:
无效的KeyConditionExpression:运算符或函数的操作数类型不正确;运算符或函数:以开头,操作数类型:N
如果尝试在其周围加引号,则会出现以下错误:
一个或多个参数值无效:条件参数类型与架构类型不匹配
不能使用带数字的
以开头。这只是字符串。您必须在“180000”和“1899999”之间使用
。然而,假设有超过六位数的ID,这将是一种可怕的方法。(您必须对每个数字范围进行比较)。这不起作用,因为我们有不同数字的ID。真的没有办法只做一个简单的where子句吗?我发现,仅仅制作一个简单的where子句的难度就非常惊人(很抱歉,这让人非常沮丧)