dynamodb:如何过滤所有没有特定属性的项目?

时间:2014-06-02 13:11:54

标签: java amazon-dynamodb

我有一个用户表,其主要哈希键为userId。每个用户可能/可能没有名为" environment"的字符串属性。 我想让所有拥有" environment" =" xyz"或者没有"环境"属性。

以下代码将使用environment = xyz过滤这些用户,但如何过滤那些没有环境的项目? Dynamo API不允许过滤空字符串。

    AmazonDynamoDBClient client = DbClientManager.getDynamoDbClient();

    ArrayList<AttributeValue> avList = new ArrayList<AttributeValue>();
    avList.add(new AttributeValue().withS("xyz"));

    Condition scanFilterCondition = new Condition()
            .withComparisonOperator(ComparisonOperator.EQ.toString())
            .withAttributeValueList(avList);
    Map<String, Condition> conditions = new HashMap<>();
    conditions.put("environment", scanFilterCondition);

    ScanRequest scanRequest = new ScanRequest()
            .withTableName("users")
            .withAttributesToGet(
                    "userId", 
                    "environment");
            .withScanFilter(conditions);

    ScanResult result = client.scan(scanRequest);

现在我刚刚删除了扫描过滤器,我在客户端进行过滤。有没有办法在服务器端做这个?

谢谢, 阿里扎

3 个答案:

答案 0 :(得分:5)

希望我不会太迟。 我找到了你可以在查询中使用的有用函数。我没有检查ScanRequest,但QueryRequest是魅力。

QueryRequest queryRequest = new QueryRequest()
            .withTableName("YouTableName")
    queryRequest.setFilterExpression(" attribute_not_exists(yourAttributeName) ")
    queryRequest.setExpressionAttributeValues(expressionAttributeValues)
    queryRequest.setExclusiveStartKey(ifYouHave)
    queryRequest.setSelect('ALL_ATTRIBUTES')
    queryRequest.setExpressionAttributeNames(youNames)

attribute_not_exists(yourAttributeName)与“:aws-sdk:1.11.11”一起使用 你也可以使用attribute_exists(yourAttributeName)

答案 1 :(得分:0)

您需要使用NULL ComparisonOperator。

点击此链接:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

  • NOT_NULL:属性存在。
  • NULL:该属性不存在。

这对你有用吗?

答案 2 :(得分:0)

我的情况也是如此,attribute_not_exists(attribute)起作用了。您可以参考以下问题:-How to check whether an attribute is not present in dynamoDB filter expression

了解更多详情。