具有组合条件的DynamoDB查询/扫描

时间:2017-02-16 17:17:11

标签: ios swift amazon-web-services amazon-dynamodb nosql

我正面临一个架构问题(或逻辑问题)并且不确定什么是最好的方法。我正在构建一个小型配对应用程序来研究AWS Mobile HUB及其服务并对其进行更加熟悉。

我的DynamoDB包含一个rendezvous的表,它具有以下2个属性(还有一些在这里不重要):

Rendezvous

- from_gender
- interest_gender

此外,我正在使用cognito并让我的用户拥有一个属性

User

- usr_gender
- interest_gender

基本上我想匹配对from_gender感兴趣并且性别为interest_gender的用户

目前,User可以是malefemale,而interest_gender可以是malefemale或{{1} }}

这意味着对于用户我们有6种组合:

all

现在变得棘手:

示例

用户A(Gender -> Interested In Male -> female Female -> female Female -> all Male -> all Male -> male Female -> male 感兴趣的female)正在寻找all

她应该看到以下4种会合类型:

rendezvous

这意味着我需要查询排序(虚拟代码):

  

rendevous.query(“

     

(from_gender =男性)AND((interest_gender =女性)OR(interest_gender = all))或

     

(from_gender = female)AND((interest_gender = female“)OR(interest_gender = all))

     

“)

然而

我还没有找到一种方法来使用查询或扫描,因为它们不支持对同一属性的OR查询。

我试过 创建indeces(使用不同组合的代码,但我找不到为所有情况创建可查询索引的方法),注意除此之外我还需要按年龄排序(最小/最大)和位置最小/最大纬度,最小/最大长度。

有没有使用DynamoDB的智能方法,还是我被迫走SQL路线?

这是我最近尝试的查询表达式:Works

from_gender, interest_gender

male, female
male, all
female, female
female, all

1 个答案:

答案 0 :(得分:1)

您是否绝对确定不能在DynamoDB OR操作中使用scan条件?我不是说你错了,我似乎记得这样做。如果我在处理同样的问题,我会尝试一些代码:

func findMatches(interestGender: String, userGender: String, allCondition: String, map: AWSDynamoDBObjectMapper) -> AWSTask<AnyObject> {
    let scan = AWSDynamoDBScanExpression()
    scan.filterExpression = "interest_gender = :interestGender AND usr_gender = :userGender OR interest_gender = :allCondition"
    scan.expressionAttributeValues = [":interest_gender":interestGender, ":usr_gender":userGender, ":interest_gender":allCondition]

    return map.scan(Rendezvous.self, expression: scan).continue({ (task: AWSTask) -> AnyObject? in
        if (task.error != nil) {
            print(task.error)
        }

        if (task.exception != nil){
            print(task.exception)
        }

        if let result = task.result {
            return result.items as! [Rendezvous] as AnyObject?
        }

        return nil
    })

}

这会假设您的Rendezvous对象符合AWSDynamoDBObjectModelAWSDynamoDBModeling。尝试一下,让我知道它是否适合你,否则我会删除我的答案。直到今晚很晚才能为你测试它,所以我不能100%肯定它会起作用。