Облачные функции База данных запросов [дубликат]

Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня document. Итак, мне нравится ниже. Обратите внимание: вы не можете переадресовать элемент с одним и тем же прослушивателем событий, поэтому не беспокойтесь о прикреплении слушателя более одного раза - только один палец.

var iterations = 4;
var button;
var body = document.querySelector("body");

for (var i = 0; i < iterations; i++) {
    button = document.createElement("button");
    button.classList.add("my-button");
    button.appendChild(document.createTextNode(i));
    button.addEventListener("click", myButtonWasClicked);
    body.appendChild(button);
}

function myButtonWasClicked(e) {
    console.log(e.target); //access to this specific button
}

20
задан koceeng 23 February 2017 в 09:54
поделиться

2 ответа

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

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 документы .

0
ответ дан Bryan Massoth 19 August 2018 в 01:51
поделиться

API Firebase позволяет только фильтровать детей на один уровень (или с известным путем ) с помощью методов 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 / иерархическими базами данных, кажется «избегать построения гнезд» .

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

24
ответ дан Frank van Puffelen 19 August 2018 в 01:51
поделиться
  • 1
    Огромное спасибо вам – denisjacquemin 14 August 2015 в 18:26
  • 2
    Обратите внимание, что глубокие запросы теперь являются признаком. – Kato 9 October 2015 в 21:25
  • 3
    Я подумал об этом несколько минут, но сдаюсь: как бы глубокий запрос разрешил эту проблему? – Frank van Puffelen 10 October 2015 в 05:31
  • 4
    Я не думаю, что глубокий запрос решает проблему; но в сообщении говорится, что вы можете запросить только одноуровневую глубину, что уже не так. – Kato 29 October 2015 в 20:57
  • 5
    @FrankvanPuffelen, я читал много ваших ответов в последнее время (вы, кажется, единственный, кто знает что-нибудь о firebase [видя, как вы являетесь инженером firebase]), и мне интересно, если вы окончательное решение в своем ответ - это лучшая практика, или мы всегда должны пытаться структурировать информацию, чтобы мы могли сделать только один звонок? – ntgCleaner 24 July 2017 в 03:55
Другие вопросы по тегам:

Похожие вопросы: