Как сделать запросOrderedbyChild и queryEqualtoValue с вложенными данными в Firebase? - PullRequest
0 голосов
/ 06 января 2020
  • Истории

    • Места
      • ChIJ-REgsXyPwTARJh1vn16yZB c (placeID)
        • название: "Токийская башня"
        • userInfo
          • M1nlb7iEg9ZU6cr28DOwJOqrlKA2 (userID)
            • Lxqcl6Zys2cjmYSzcWU (autoID)
              • dateAdded: "2020-01-05" * 1019 взаимодействие: 1019T 10 * 1019 "placeTap"
let historiesPlacesRef = Database.database().reference().child("Histories").child("Places")

Когда я выбираю место с названием «Токийская башня», используя следующее, оно работает.

historiesPlacesRef
    .queryOrdered(byChild: "name")
    .queryEqual(toValue: "Tokyo Tower")
    .observe(.value) { (dataSnapshot) in
        print(dataSnapshot)
    }

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

historiesPlacesRef
    .queryOrdered(byChild: "userInfo")
    .queryEqual(toValue: Auth.auth().currentUser!.uid)
    .observe(.value) { (dataSnapshot) in
        print(dataSnapshot)
    }

1 Ответ

0 голосов
/ 06 января 2020

Запросы Firebase могут проверять только те значения, которые находятся в известном местоположении под каждым дочерним узлом местоположения, которое вы запрашиваете. Таким образом, в вашей текущей структуре вы можете найти все места с указанным c именем или все время, когда указанный пользователь c посещал Токийскую башню в 2020 году. Но вы не можете найти всех пользователей во всех городах или выполнить поиск по всем посещения города (благодаря автоматическому идентификатору).

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

UserPlaces: {
  UID1: {
    placeID1: {
      dateAdded: "2020-01-05",
      interactionType: "placeTap"
    }
    placeID2: {
      dateAdded: "2020-01-04",
      interactionType: "somethingElse"
    }
  }
  UID2: {
    placeID1: {
      dateAdded: "2020-01-05",
      interactionType: "somethingElseAgain"
    }
  }
}

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

Также см. Мои ответы здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...