我试图在DynamoDB查询(在Node.JS环境中)上运行过滤器表达式,因为其中一个属性不在这些属性的列表中。我这样做:
documentClient.query( {
TableName: 'event',
IndexName: 'OrganisationTimestamp',
KeyConditionExpression: '#ts BETWEEN :from AND :to',
ExpressionAttributeNames: {
'#ts': 'Timestamp'
},
ExpressionAttributeValues: {
':to': to,
':from': from,
':ignoredUserIds': "1, 2, 3"
},
FilterExpression: 'not (userId in (:ignoredUserIds))'
})
但是我在这里没有任何运气,并且使用该范围内的userId属性获取项目。
非常感谢任何帮助,谢谢!
答案 0 :(得分:3)
IN
- 仅当userId
属性定义为DynamoDB LIST
数据类型
IN:检查列表中的匹配元素。
AttributeValueList可以 包含一个或多个String,Number或类型的AttributeValue元素 二进制。这些属性与现有属性进行比较 一个物品。如果输入的任何元素等于item属性, 表达式的计算结果为真。
<强>解决方案:强>
如下所述更改FilterExpression和ExpressionAttributeValues。它应该工作。
ExpressionAttributeValues: {
':to': to,
':from': from,
':userid1': "1",
':userid2': "2",
':userid3': "3"
},
FilterExpression: 'userId <> :userid1 and userId <> :userid2 and userId <> :userid3'
答案 1 :(得分:1)
您正在使用ignoredUserIds
,就像它是一个宏...
你应该这样做:
ExpressionAttributeValues: {
':to': to,
':from': from,
':id1': 1,
':id2': 2,
':id3': 3,
},
FilterExpression: 'not (userId in (:id1, :id2, id3))'
如果你只是映射数字,你应该能够做到:
FilterExpression: 'not (userId in (1, 2, 3))'