Как использовать startAt () в запросе Firebase?

enter image description here

предположим выше схемы базы данных firebase.

то, что я хочу, это получить сообщения, которые после отметки времени "15039996197". Каждый из объектов message имеет createdAt собственность.

Как я могу получать сообщения только после определенной метки времени? В этом случае, последние два сообщения-то, что я хочу получить.

пробовал firebaseb.database().ref(`/rooms/$roomKey/messages`).startAt('15039996197'), но не удалось. Она возвращает 0. Как я могу это сделать?

3 ответов


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

firebase.database().ref(`/rooms/$roomKey/messages`).orderByChild('createdAt').startAt('15039996197').on(//code);

таким образом, он вернет все узлы внутри message что есть ребенок по имени createdAt оно начинается с 15039996197. Заказ вашего запроса может быть немного плохим для производительности, для этого я sugest взглянув на. правило indexOn.

для получения дополнительной информации посмотрите здесь.

надеюсь, что это помогает.


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

вы хотели бы реструктурировать способ хранения данных и поместить createdAt в узел вместо дочернего.


вы можете сделать что-то вроде этого:

firebase.database().ref('/rooms/$roomKey/messages')
                .orderByChild('createdAt')
                .startAt('150399')
                .endAt('1503999\uf8ff')
                .on('value', function (snapshot) {
                    var key = snapshot.key,
                    data = snapshot.val();
                    console.log(key + ': ' + JSON.stringify(data))
                });

обязательно установите endAt ().