我正面临一个架构问题(或逻辑问题)并且不确定什么是最好的方法。我正在构建一个小型配对应用程序来研究AWS Mobile HUB及其服务并对其进行更加熟悉。
我的DynamoDB包含一个rendezvous
的表,它具有以下2个属性(还有一些在这里不重要):
Rendezvous
- from_gender
- interest_gender
此外,我正在使用cognito并让我的用户拥有一个属性
User
- usr_gender
- interest_gender
基本上我想匹配对from_gender
感兴趣并且性别为interest_gender
的用户
目前,User
可以是male
或female
,而interest_gender
可以是male
,female
或{{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
答案 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
对象符合AWSDynamoDBObjectModel
和AWSDynamoDBModeling
。尝试一下,让我知道它是否适合你,否则我会删除我的答案。直到今晚很晚才能为你测试它,所以我不能100%肯定它会起作用。