Firebase Query Double Nested

Учитывая структуру данных ниже в firebase, я хочу запустить запрос для извлечения блога «efg». На данный момент я не знаю идентификатора пользователя.

{Users : "1234567": { name: 'Bob', blogs: { 'abc':{..}, 'zyx':{..} } }, "7654321": { name: 'Frank', blogs: { 'efg':{..}, 'hij':{..} } } } 

API Firebase позволяет только фильтровать детей на один уровень (или с известным путем ) с orderByChild методов orderByChild и equalTo .

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

 var ref = firebase.database().ref('Users'); ref.once('value', function(snapshot) { snapshot.forEach(function(userSnapshot) { var blogs = userSnapshot.val().blogs; var daBlog = blogs['efg']; }); }); 

Это, конечно, очень неэффективно и не будет масштабироваться, если у вас нетривиальное количество пользователей / блогов.

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

 {Blogs: "abc": "1234567", "zyx": "1234567", "efg": "7654321", "hij": "7654321" } 

Затем вы можете быстро получить доступ к блогу, используя:

 var ref = firebase.database().ref(); ref.child('Blogs/efg').once('value', function(snapshot) { var user = snapshot.val(); ref.child('Blogs/'+user+'/blogs').on('value, function(blogSnapshot) { var daBlog = blogSnapshot.val(); }); }); 

Вы также можете пересмотреть, если вы можете реструктурировать свои данные, чтобы лучше соответствовать ограничениям использования и Firebase. У них есть хорошая документация по структурированию ваших данных, но самая важная для людей, не знакомых с NoSQL / иерархическими базами данных, кажется, «избегает строить гнезда» .

Также см. Мой ответ на запрос Firebase, если дочерний элемент child содержит значение для хорошего примера.

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

 const db = firebase.database() const usersRef = db.ref('users') const query = usersRef.orderByChild('blogs/efg').limitToLast(1) query.once('value').then((ss) => { console.log(ss.val()) //=> { '7654321': { blogs: {...}}} }) 

Вам нужно использовать limitToLast поскольку объекты сортируются последним при использовании документов orderByChild .

  • Как защитить Firebase Cloud Function HTTP-конечную точку, чтобы разрешать только проверенные пользователями Firebase?
  • Отображение данных Firebase в ListView
  • Как сохранить текущую дату / время, когда я добавлю новое значение в базу данных Firebase Realtime
  • Запрос, основанный на нескольких предложениях в Firebase
  • Сервер управления Firebase для поддержания счетчиков и агрегатов
  • Производительность Firebase: Сколько детей на узел?
  • Как преобразовать данные Firebase в объект Java ...?
  • Ограничение доступа для детей и полей с помощью правил безопасности
  • Как использовать временную метку сервера Firebase для создания даты?
  • Ограничение скорости в Firebase в правилах безопасности?
  • Как найти значение в firebase Android
  • Давайте будем гением компьютера.