web-dev-qa-db-ja.com

すべての子の中に特定の値を持つプロパティのファイアベースをクエリする方法

このデータ構造は、todosがパス/ todos/uid /をたどるように整理されています

{
  "metausers" : {
    "simplelogin:1" : {
      "displayName" : "John Doe",
      "provider" : "password",
      "provider_id" : "1"
    },
    "simplelogin:2" : {
      "displayName" : "GI Jane",
      "provider" : "password",
      "provider_id" : "2"
    }
  },
  "todos" : {
    "simplelogin:1" : {
      "-JUAfv4_-ZUlH7JqM4WZ" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : false,
        "subject" : "First"
      },
      "-JUAfveXP_sqqX32jCJS" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : true,
        "subject" : "Second"
      },
      "-JUAfwXnMo6P53Qz6Fd2" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : false,
        "subject" : "Third"
      }
    },
    "simplelogin:2" : {
      "-JUAg9rVemiNQykfvvHs" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : false,
        "subject" : "Q first"
      },
      "-JUAgAmgPwZLPr2iH1Ho" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : false,
        "subject" : "Q second"
      },
      "-JUAgBfF8f7V5R5-XgrY" : {
        "completed" : false,
        "done" : false,
        "group" : false,
        "private" : true,
        "subject" : "Q third"
      }
    }
  }
}

そして、private:trueですべてのレコードを取得するために、todosをクエリしたいと思います。これはfirebase(angularfire)を使用して可能ですか?どのようにすればよいですか?または、もう少し非正規化し、todosを歩くのを避けるためにpath/privateを配置する必要がありますか?

36
Denis

FirebaseにはWHERE句はありません。 このスレッド 複数のフィールドで検索するための優れた構造的なヒントについては このスレッド データベーススタイルのクエリ、 このブログ はクエリ、および- ドキュメント

最初のアプローチは、データを読み返す方法でセグメント化することです。次のようなもの:

/todos/public
/todos/private
/todos/completed

また、ドキュメントで説明されているように、 優先度を利用 することもできます。次に、優先度に基づいてアイテムを取得します。

リストが1,000未満の場合(データが適切にパーティション化されている場合)、todoリストを取得してクライアントでフィルタリングすることもできます。このような短いコレクション、特にAngularのような素晴らしいバインディングライブラリ。

17
Kato

Uidを持っていると仮定すると、これは次のように簡単です。

var uid = "simplelogin:1";
var todosRef = new Firebase("https://yourdb.firebaseio.com/todos/" + uid);
var privateTodosRef = todosRef.orderByChild("private").equalTo(true);
var privateTodos;

privateTodosRef.on("value", function(response) {
  privateTodos = response.val();
});

これにより、todoキー(つまり"-JUAfv4_-ZUlH7JqM4WZ"。 Angularfireを使用する場合は、これを$ firebaseArrayでラップし、次のように割り当てることができます。

$scope.privateTodos = $firebaseArray(privateTodosRef);

複雑なクエリの詳細については 参照 を参照してください。また、他の応答で述べたように、優先度と再構築で実行できるいくつかの素晴らしい最適化があります。

ハッピーコーディング!

55
Matt

FirebaaseのすべてのデータにはURLでアクセスできます。 Firebaseダッシュボードに移動してデータモデル(Forge)を表示し、目的のプロパティをクリックすると、この特定のデータにアクセスできるURLにリダイレクトされます。 https://myapp.firebaseio.com/todos/simplelogin:1/-JUAg9rVemiNQykfvvs/private 。これを念頭に置いて、AngularFireでこのデータにアクセスできます。