Как получить ключ из моментального снимка данных 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'
        ...

enter image description here

Как получить ключ (-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);
      })
      })