Firebase — запрос свойства объекта с определенным и неспецифическим значением

# #swift #google-cloud-firestore

Вопрос:

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

  • карМейк:
  • Кармодель:
  • Цвет автомобиля:

Допустим, первые 2 поля содержат конкретную информацию:

  • карМейк: «Форд»
  • Кармодель: «Мустанг»

Но для третьего поля я могу запросить все значения определенного цвета: красный, синий и т.д. Вопрос, который у меня есть, заключается в том, как я могу запросить третье поле, используя:

  • Цвет автомобиля: «Все цвета»

Если «Все цвета» не является определенным значением? Я использовал: .whereField(CAR_COLOR, isGreaterThanOrEqualTo или arrayContains или arrayContainsAny и т. Д.), И это не работает. Я не получаю никаких результатов. Есть какие-нибудь идеи? Спасибо!

Комментарии:

1. Если вы хотите, чтобы он возвращал все, независимо от того, какой цвет находится в этом поле, зачем whereField вообще использовать запрос?

2. Поле carColor должно предоставить конечному пользователю возможность, если он хочет отфильтровать определенный цвет (красный, синий и т.д.) Или если он хочет видеть все, независимо от цвета, он может использовать «Все цвета».

3. Хорошо. Итак, если они выберут «все цвета», то я изо всех сил пытаюсь понять, почему вы whereField carColor вообще использовали бы в этом случае.

4. «Все цвета» не назначаются ни одному объекту carColor. Я использую поле Где, чтобы пользователь мог фильтровать по определенному цвету. Позвольте мне тогда спросить вас, можно ли обойти поле carColor, если в запросе я выбираю «Все цвета»? но если запрос имеет определенный цвет «Красный», не обходите и не запускайте его?

5. Проще всего, вы могли бы просто использовать if { } else { } для выполнения различных запросов. Но, если вы хотите использовать ту же цепочку запросов, я добавил ниже ответ, который позволил бы использовать условный whereField запрос. Вы хотели бы пройти false useCondition в случае, если вы не хотите выполнять запрос.

Ответ №1:

Основываясь на обсуждении комментариев, похоже, что вы хотите иметь возможность включать whereField в свою цепочку запросов, но фактически не выполнять ее, если определенные условия являются истинными/ложными.

Я предлагаю добавить расширение в Query :

 extension Query {
    func whereField(useCondition: Bool, _ field: String, arrayContains: String) -> Query {
        if useCondition {
            return self.whereField(field, arrayContains: arrayContains)
        } else {
            return self
        }
    }
}
 

Тогда вы могли бы сделать что-то вроде этого:

 db.collection("car").whereField(useCondition: !allColors, "carColor", arrayContains: searchedColor)
 

Обратите внимание, что вам, возможно, придется настроить это в соответствии с тем разнообразием whereField , которое вам нужно.