2017-02-16 5 views
0

Я столкнулся с архитектурной проблемой (или логической) и не уверен, что это лучший способ для продолжения. Я создаю небольшое приложение для знакомств, чтобы изучить AWS Mobile HUB и его услуги, и немного поближе познакомиться с ним.DynamoDB Query/Scan с комбинированными условиями

Мои 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 или all.

Это означает, что для пользователя у нас есть 6 комбинаций:

Gender -> Interested In 

Male -> female 
Female -> female 
Female -> all 
Male -> all 
Male -> male 
Female -> male 

Теперь она становится сложнее:

Пример

Пользователь A (female заинтересован в all) ищет rendezvous

Ей следует показать 4 следующих rendezvou ые типы:

from_gender, interest_gender 

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

, что означает, что я должен был бы запрос сортов (dummycode):

rendevous.query (»

(from_gender = мужчина) и ((interest_gender = самку ") ИЛИ (interest_gender = все)) ИЛИ

(from_gender = женщина) и ((interest_gender = женский") ИЛИ (interest_gender = все))

«)

Однако

Я еще не нашел способ, чтобы получить эту работу с запросом или сканирования, поскольку они не поддерживают или запросов на одной и той же собственности.

Я попытался создать индексы (используя коды для различных комбинаций, но я не нашел способ создания индекса запрашиваемого для всех случаев), примечания что дополнительно к этому интересу, я бы также нужен сортировать по возрасту (между min/max) и положением min/max lat, min/max long.

Есть ли какие-либо умные подходы с использованием DynamoDB или я вынужден идти по SQL-маршруту?

Это выражение запроса я попробовал последнее: Работает

func generateScanExpression() -> AWSDynamoDBScanExpression { 
    let usr = UserHelper.sharedHelper.currentUser 
    let expression = AWSDynamoDBScanExpression() 
    expression.limit = 10 

    // Male interested in male 
    if (usr?.interest == Constants.CONST_MALE) && (usr?.gender == Constants.CONST_MALE){ 
     expression.filterExpression = "details_fromGender = :fg AND (match_interest = :ig OR match_interest = :all)" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_MALE, ":ig": Constants.CONST_MALE, ":all": Constants.CONST_ALL ] 
    } 
    // Female interested in female 
    if (usr?.interest == Constants.CONST_FEMALE) && (usr?.gender == Constants.CONST_FEMALE){ 
     expression.filterExpression = "details_fromGender = :fg AND (match_interest = :ig OR match_interest = :all)" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_FEMALE, ":ig": Constants.CONST_FEMALE, ":all": Constants.CONST_ALL ] 
    } 
    // Male interested in female 
    if (usr?.interest == Constants.CONST_FEMALE) && (usr?.gender == Constants.CONST_MALE){ 
     expression.filterExpression = "details_fromGender = :fg AND (match_interest = :ig OR match_interest = :all)" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_FEMALE, ":ig": Constants.CONST_MALE, ":all": Constants.CONST_ALL ] 
    } 
    // Female interested in male 
    if (usr?.interest == Constants.CONST_MALE) && (usr?.gender == Constants.CONST_FEMALE){ 
     expression.filterExpression = "details_fromGender = :fg AND (match_interest = :ig OR match_interest = :all)" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_MALE, ":ig": Constants.CONST_FEMALE, ":all": Constants.CONST_ALL ] 
    } 
    // Male interested in all 
    if (usr?.interest == Constants.CONST_ALL) && (usr?.gender == Constants.CONST_MALE){ 
     expression.filterExpression = "(details_fromGender = :fg OR details_fromGender = :all) AND match_interest = :ig" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_MALE, ":ig": Constants.CONST_MALE ] 
    } 
    // Female interested in all 
    if (usr?.interest == Constants.CONST_ALL) && (usr?.gender == Constants.CONST_FEMALE){ 
     expression.filterExpression = "(details_fromGender = :fg OR details_fromGender = :all) AND match_interest = :ig" 
     expression.expressionAttributeValues = [":fg": Constants.CONST_MALE, ":ig": Constants.CONST_FEMALE ] 
    } 

    return expression 
} 

ответ

1

Вы абсолютно уверены, что вы не можете использовать OR условие на scan операции DynamoDB? Я не говорю, что ты ошибаешься, я просто помню, как это делаю. Вот код, я хотел бы попробовать, если бы я работал по тому же вопросу:

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%, что он будет работать.

+0

Мне также нужно будет проверить завтра, я вполне уверен, но не на 100%, мои попытки пока не удались. попробуем с вашим образцом :) спасибо! –

+0

Это действительно работает, спасибо! Я обновил свой окончательный запрос к вопросу для справки. –

+0

@SebastianFluckiger - Я так рад, что работает на вас! Хорошо знать! Удачи – Pierce

 Смежные вопросы

  • Нет связанных вопросов^_^