#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 Я просмотрел несколько сообщений о заказе и сделал то, что было рекомендовано. Создан отдельный массив, который принимает только строку без имени поля.