Я предпочитаю, чтобы прослушиватели событий были развернуты модульной функцией, а не сценарием прослушивателя событий уровня 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
}
С учетом вашей текущей структуры данных вы можете получить пользователя, который содержит сообщение в блоге, которое вы ищете.
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
документы .
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 для хорошего примера.