Как получить ключ из моментального снимка данных Firebase?
Я могу запросить массив users
с адресом электронной почты и вернуть информацию об учетной записи пользователя:
users.orderByChild('email').equalTo(authData.user.email).once('value').then(function(snapshot) {
console.log(snapshot.val());
console.log(snapshot.key); // 'users'
console.log(snapshot.child('email').key); 'email'
...
Как получить ключ (-KiBBDaj4fBDRmSS3j0r
). snapshot.key
возвращает users
. snapshot.child('email').key
возвращает email
. Ключ не является дочерним, т.е. Он находится между users
и email
.
Ответы
Ответ 1
Вы могли бы сделать что-то вроде этого:
var key = Object.keys(snapshot.val())[0];
Ссылка: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Метод Object.keys() возвращает массив заданных объектов собственных перечислимых свойств в том же порядке, что и в цикле for for... in (разница заключается в том, что цикл for-in перечисляет свойства в цепочке прототипов как Что ж).
Ответ 2
База данных в реальном времени:
Для этого вы можете просто использовать: snapshot.key
snapshot = firebase.database.DataSnapshot
this.app.database()
.ref('/data/')
.on('value', function(snapshot) {
const id = snapshot.key;
//----------OR----------//
const data = snapshot.val() || null;
if (data) {
const id = Object.keys(data)[0];
}
});
Пожарный магазин:
snapshot.id
snapshot = firebase.firestore.DocumentSnapshot
this.app.firestore()
.collection('collection')
.doc('document')
.onSnapshot(function(snapshot) {
const id = snapshot.id;
//----------OR----------//
const data = snapshot.data() || null;
if (data) {
const id = Object.keys(data)[0];
}
});
Ответ 3
Подобно camden_kid, я использовал Object.keys(arr)
, но в трех строках:
var arr = snapshot.val();
var arr2 = Object.keys(arr);
var key = arr2[0];
console.log(key) // -KiBBDaj4fBDRmSS3j0r
Ответ 4
users.orderByChild('email').equalTo(authData.user.email)
- это запрос (doc), который вы создали путем "объединения одного или нескольких методов фильтра". Что конкретно зависит от вашего запроса, так это то, что он возвращает dataSnapshot только с одним дочерним элементом, поскольку вы запрашиваете с equalTo(authData.user.email)
.
Как поясняется здесь, в этом конкретном случае вам нужно перебрать возвращаемый dataSnapshot с помощью forEach()
:
Прикрепление наблюдателя значений к списку данных вернет весь список данных в виде одного моментального снимка, который затем можно перебрать для доступа к отдельным детям.
Даже если для запроса имеется только одно совпадение, моментальный снимок по-прежнему является списком; он просто содержит один элемент. Чтобы получить доступ к элементу, вам необходимо выполнить цикл по результату, как показано ниже:
ref.once('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
// ...
});
});
Ответ 5
Я нашел новый способ получить данные на основе ключа снимка -
firebase.database().ref('events').once('value',(data)=>{
//console.log(data.toJSON());
data.forEach(function(snapshot){
var newPost = snapshot.val();
console.log("description: " + newPost.description);
console.log("interest: " + newPost.interest);
console.log("players: " + newPost.players);
console.log("uid: " + newPost.uid);
console.log("when: " + newPost.when);
console.log("where: " + newPost.where);
})
})