不在

时间:2017-01-23 23:49:41

标签: node.js amazon-dynamodb

我试图在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属性获取项目。

非常感谢任何帮助,谢谢!

2 个答案:

答案 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))'