Я столкнулся с архитектурной проблемой (или логической) и не уверен, что это лучший способ для продолжения. Я создаю небольшое приложение для знакомств, чтобы изучить 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
}
Мне также нужно будет проверить завтра, я вполне уверен, но не на 100%, мои попытки пока не удались. попробуем с вашим образцом :) спасибо! –
Это действительно работает, спасибо! Я обновил свой окончательный запрос к вопросу для справки. –
@SebastianFluckiger - Я так рад, что работает на вас! Хорошо знать! Удачи – Pierce