Как получить потомков коллекции из Firebase с помощью VueJS - PullRequest
0 голосов
/ 26 февраля 2019

У меня проблемы с получением правильного результата из firebase.

Мой код

const rootRef = firebase.database().ref()
console.log(rootRef)
const allEmployees = rootRef.child('employees').orderByChild('name').startAt('J')
console.log("These are all employees which names start with a J" + allEmployees)

Это результат в консоли

Reference {repo: Repo, path: Path, queryParams_: QueryParams, 
 orderByCalled_: false}
 database: (...)
 key: (...)
 orderByCalled_: false 
 parent: (...)
 path: Path {pieces_: Array(0), pieceNum_: 0}
 queryParams_: QueryParams {limitSet_: false, startSet_: false, 
 startNameSet_: false, endSet_: false, endNameSet_: false, …}
 ref: (...)
 repo: Repo {repoInfo_: RepoInfo, app: FirebaseAppImpl, dataUpdateCount: 
 0, statsListener_: null, eventQueue_: EventQueue, …}
 root: (...)
 __proto__: Query

These are all employees which names start with a J https://xxxxxxxx .firebaseio.com/employees

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

Я также пытался сопоставить категорию, в которую входит сотрудник,

rootRef.child('employees').orderByChild('categoryID').equalTo('608Av3zkDS0cg2Iu66b2')
console.log(allEmployees)

Но это дало тот же результат, URL базы данных.

Может кто-нибудь, пожалуйста, помогите мне.Я ломал голову над этим часами.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

все, что делает ваш текущий код - это создание запроса к базе данных Firebase Realtime.Он еще не выполнил этот запрос, поэтому нет результатов для показа.В итоге вы печатаете только определение объекта запроса.

Чтобы получить результаты из базы данных, присоедините прослушиватель к запросу с помощью on() или once(), как показано в документации для слушателей .

Более вероятный подход:

const rootRef = firebase.database().ref()
const query = rootRef.child('employees').orderByChild('name').startAt('J')
query.once('value', function(snapshot) {
  snapshot.forEach(function(employeeSnapshot) {
    console.log(employeeSnapshot.key, employeeSnapshot.val());
  });
})

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


Обратите внимание, что вы, похоже, неправильно понимаете, как упорядочение и фильтрация тоже работают.Ваш запрос указывает базе данных упорядочить все дочерние узлы сотрудников по их имени, затем найти первый дочерний узел, начинающийся с J, и вернуть все дочерние узлы после этого.Это также включает в себя дочерние узлы, которые начинаются с K, L, M и т. Д. Если вы не хотите этого, вы должны указать Firebase прекратить возвращать узлы в некоторый момент:

const query = rootRef.child('employees').orderByChild('name').startAt('J').endAt('J\uF8FF')

Здесь uF8FF - последний печатаемый символ Юникода, который гарантирует, что вы получите все результаты (но только те), которые начинаются с J.


0 голосов
/ 26 февраля 2019

Глядя на документы, кажется, что это не целевое использование orderByChild и startAt

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

Посмотрите на вопрос Запросы документов Firestore начинаются со строки для вариантов реализации функциональности starts with.Я не собираюсь копировать / вставлять их ответы.

Другая (непроверенная) возможность - это ...

Если вы часто делаете этот запрос, вы можете создать свойство (называемое startWith)на каждом узле.Это будет содержать заглавную первую букву вашего свойства name, и тогда вы сможете выполнять эту функцию.OrderByChild ('setsWith'), скорее всего, не будет сортировать имена в пределах startWith, если после него не будет применена другая сортировка.

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