我正在使用NodeJS和DynamoDB。我之前从未使用过DynamoDB,主要是C#开发人员(这只是一个.Where(x => x...
)调用,不知道为什么亚马逊会让它变得更加复杂。)我试图只是根据id是否以某些字符开头来查询表。例如,我们将年份作为Id
字段的前2个字符。所以像这样:180192
,所以年份是2018. 20
部分是无关紧要的,只是想给出一个人类可读的例子。因此,Id以18
或17
开头,我只想查询数据库中所有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();
答案 0 :(得分:0)
似乎没有实际的解决方案,我原本试图做的不幸。这是DynamoDB的巨大垮台。确实需要某种方式来使用列的值来“在哪里”,就像在几乎任何其他语言中一样。但是,我不得不承认,问题的一部分是id
的结构方式。你不应该依赖id来获取信息。无论如何,我确实找到了另一个列DateofFirstCapture
,它使用with contains(所有日期格式都不一样,这是一团糟)并且使用一年2018
或2017
似乎正在起作用。
答案 1 :(得分:0)
如果要按ID提取数据,请将其添加为分区键。如果要按字符串的一部分获取数据,则可以在排序键上使用“开头为”。
begins_with(a,substr)-如果属性a的值以特定的子字符串开头,则为true。
来源:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/Query.html