web-dev-qa-db-ja.com

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.keyusersを返します。 snapshot.child('email').keyemailを返します。キーは子ではないように見えます。つまり、usersemailの間にあるように見えます。

24

次のようなことができます:

var key = Object.keys(snapshot.val())[0];

参照: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Object ...まあ)。

37
camden_kid

リアルタイムデータベース

このために、簡単に使用できます:snapshot.key

スナップショット= 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];
            }
        });

Firestore

snapshot.id

スナップショット= 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];
            }
        });
19
Ernestyno

Camden_kidと同様に、Object.keys(arr)を使用しましたが、次の3行です。

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 )であり、「1つ以上のフィルターメソッドを連結する」ことで作成しました。クエリで少し具体的なのは、equalTo(authData.user.email)でクエリを実行するため、1つの子のみでdataSnapshotを返すことです。

here で説明したように、この正確なケースでは、forEach()で返されたdataSnapshotをループする必要があります。

値オブザーバーをデータのリストにアタッチすると、データのリスト全体が単一のスナップショットとして返され、個々の子にアクセスするためにループオーバーできます。

クエリに一致するものが1つしかない場合でも、スナップショットはリストのままです;単一のアイテムが含まれているだけです。アイテムにアクセスするには、次のように結果をループ処理する必要があります

ref.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});
2
Renaud Tarnec

スナップショットキーに基づいてデータを取得する新しい方法を見つけました-

 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);
      })
      })
0
Karan Prajapati