39

以下のファイアベースのデータ構造を考慮して、クエリを実行してブログ「efg」を取得したいと考えています。この時点では、ユーザー ID はわかりません。

{Users :
     "1234567": {
          name: 'Bob',
          blogs: {
               'abc':{..},
               'zyx':{..}
          }
     },
     "7654321": {
          name: 'Frank',
          blogs: {
               'efg':{..},
               'hij':{..}
          }
     }
}
4

3 に答える 3

38

Firebase API では、およびメソッドを使用して、1 レベルの深さ (または既知のパス) でのみ子をフィルタリングできます。orderByChildequalTo

したがって、現在のデータ構造を変更/拡張せずに、すべてのデータを取得してクライアント側でフィルタリングするオプションを残すだけです:

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').once('value', function(blogSnapshot) {
        var daBlog = blogSnapshot.val();
    });
});

また、ユースケースと Firebase の制限により適合するようにデータを再構築できるかどうかを再検討することもできます。データの構造化に関する優れたドキュメントがいくつかありますが、NoSQL/階層型データベースを初めて使用する人にとって最も重要なのは、「ネストの構築を避ける」ことのようです。

子の子に良い例の値が含まれている場合は、Firebaseクエリに関する私の回答も参照してください。また、Firebase での多対多の関係と、一般的なNoSQL データ モデリングに関するこの記事を読むことをお勧めします。

于 2014-11-29T23:53:58.023 に答える