FireStore — Поиск значения в массиве

#swift #firebase #google-cloud-firestore

#swift #firebase #google-облако-firestore

Вопрос:

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

         .whereField("Features.tagName", arrayContains: tagName)
        .whereField("Features", arrayContains: "tagName: (tagName)")
        .whereField("Features", arrayContains: "tagName: (tagName)")
        .whereField("Features", arrayContainsAny: [tagName])
        .whereField("Features", in: [tagName])
        .whereField("Features.tagName", arrayContainsAny: [tagName])
  

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

Я указываю на правильную коллекцию, поскольку я объявил глобальную константу, которую я могу вызывать и использовать для других запросов / методов.

Моя база данных структурирована следующим образом:

 Post - 
 PostID -
   username
   date
   features[]
  

Однако следует отметить, что мой массив функций структурирован следующим образом:

 features: [
[0] tagName: "Blue",
[1] tagName: "Yellow"
]
  

Кажется, я ничего не могу вернуть. Я запрашиваю только по одному тегу. У меня сильное чувство, что это из-за tagName . Но я использовал интерполяцию или хорошо пытался, но все равно не повезло.

Кто-нибудь знает, где я ошибаюсь?

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

1. Будет ли features массив содержать что-либо еще кроме tagNames ?

2. @Emmanuel Я знаю, в чем проблема. Я использовал CodingKeys / identified, чтобы пользователи могли выбирать теги. И у меня есть ключ с именем tagName если я удалю этот префикс из массива перед загрузкой, я смогу запросить индекс. Однако это само по себе является сложной задачей. Однако, чтобы ответить на ваш вопрос, features будет содержать ТОЛЬКО tagName .

3. Чего вы ожидаете от этого кода .whereField("Features.tagName" ? Более конкретно, что такое Features ? Ваш массив features ? Также это [0] имя тега: «Blue», действительно не похоже на обычный массив firestore — это похоже на массив карт?

4. Кроме того, я считаю, что вы не можете выполнить запрос к объектному полю внутри массива, но, как уже упоминалось, не совсем ясно, из чего состоит эта структура. Можете ли вы уточнить?

Ответ №1:

Как упоминалось в вашем комментарии, рекомендуемый способ сделать это — удалить tagName , поскольку все элементы массива будут иметь ключ tagName , и оставить структуру как:

 features: [
  "Blue",
  "Yellow"
]
  

Затем вы можете запросить его:

 db.collection("Post")
  .whereField("features", arrayContains: "Blue")
  

Однако, если изменение структуры невозможно, вы можете запросить его как:

 db.collection("Post")
  .whereField("features.tagName", isEqualTo: "Blue")
  

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

1. К сожалению, это не работает. Я уже пробовал это решение раньше.

2. вы выполнили свой запрос, используя тот же корпус, что и объявленный в вашей коллекции? Помните, что запросы чувствительны к регистру

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

4. где вы добавили точку с запятой? не могли бы вы отредактировать свой пост, чтобы показать структуру вашей коллекции / документа и точный пример того, как вы ее запрашиваете? Я спрашиваю, потому что в опубликованном примере ваше использование Features с большой буквы F и описание структуры имеет features

5. @Jay Я просмотрел несколько сообщений о заказе и сделал то, что было рекомендовано. Создан отдельный массив, который принимает только строку без имени поля.