2016-05-05 4 views
2

私のReact-Nativeアプリでは、値をFirebaseから取得したい特定のユーザーの配列があります。これを行う最も効率的な方法は何ですか?現在、私は配列をループし、それぞれの新しい要求(以下、関連するコード)を作っています:Firebaseからオブジェクトのグループを取得するには?

const usersRef = new Firebase(`${ config.FIREBASE_ROOT }/users`) 

for (var key in usersArray) { 
    var userRef = usersRef.child(key); 
    //do stuff here 
} 

しかし、私は、これは非常に効率的ではありません、それはデータベースにいくつかの要求を行う感じます。配列に渡してFirebaseのアイテムを1回の呼び出しですべて取得できる方法はありますか?ありがとう。

Firebaseデータ構造:

{ 
    "items" : [ { 
    "description" : "fuzzy socks", 
    "type" : "toy" 
    }, { 
    "description" : "bouncy ball", 
    "type" : "toy" 
    }, { 
    "description" : "scrabble", 
    "type" : "game" 
    }, { 
    "description" : "construction paper", 
    "type" : "crafts" 
    } ], 
"users" : [ { 
    "itemList" : [ 1, 2, 3, 4 ], 
    "description" : "brown", 
    }, { 
    "itemList" : [ 5, 6, 7 ], 
    "description" : "green", 
    }, { 
    "itemList" : [ 8, 9, 10 ], 
    "description" : "blue", 
    }, { 
    "itemList" : [ 11, 12, 13 ], 
    "description" : "yellow", 
    } ] 
} 

簡素化されたユースケース:1ユースケースで、私は情報だけに約2私はFirebaseに保存されているすべてのユーザのうち、ユーザ(のを取得したい - それはだと仮定上記の構造の4つ以上のもの)。だから、私は配列importantUsers持っている:

var importantUsers = [0, 3] 

をその後、私はこれらのユーザーIDの値に関連付けられた値をデータベースに照会することFirebaseにリクエストを送信する(ので何とか結果をFirebaseに配列を渡します)。一度に複数のユーザーのためのデータベースを照会(というよりも、ユーザ0とユーザ3に別々の参照を作成する)ための

0: itemList: [1,2,3,4], description: brown 
3: itemList: [11,12,13], description: yellow 

私のモチベーションFirebaseに行われた複数の呼び出しを持っていないことです。戻り値は、このようなものになるだろう。これについて行く方法はありますか?

+0

Firebaseのデータ構造を投稿できますか?テキストとして投稿してください(画像はありません)。テキストはFirebaseダッシュボード - >エクスポートボタンから取得できます。 – Jay

+0

@Jayちょうどこれで更新されました。 – user3802348

+0

「値を持つ特定のユーザーの配列」と言うとき、そのユーザーをユーザーと定義し、そのユーザーを特定のものにし、どんな価値があるのですか?あなたのFirebase構造には、ユーザーノードと、次にitemList(配列)と説明のキー値のペアを含む辞書の配列があり、どちらもユーザーではありません。ユーザーノードにある配列内の特定のアイテムリスト*にアクセスする方法を尋ねていますか? – Jay

答えて

2

ことなく、必要に応じてあなたは、だから何あなたが後にしていることはタイプのクエリ「の」sqlですその後ReactFire

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/items"); 
    this.bindAsArray(ref, "items"); 

からその配列/オブジェクトの上にループをbindAsArray or bindAsObjectを可能性が使用することができます。 [0,2]で選択します。リストから多数のユーザーを選択する。

あなたの質問には、興味のあるユーザーはランダムなので、.startAtと.endAtは使用できず、ユーザー間には他の関係はありません。

Firebaseは 'in'、 'and' or 'または'種類のクエリを直接サポートしていませんが、それを実現する方法はいくつかあります。

これはどう:あなたが欲しいユーザーにフラグを設定して、単一のクエリで、それらを読ん

まず、あなたは「選択された」子どものほかに、典型的なFirebase /ユーザノードから始めましょうノード(これは最初に省略することができますが、私はプレースホルダとして、ここでそれを示しています)

users 
uid_0 
    name: "Bud" 
    selected: false 
uid_1 
    name: "Henry" 
    selected: false 
uid_2 
    name: "Billy" 
    selected: false 

その後、我々は、いくつかのランダムなUID年代を必要uid_0とuid_2を言うと、配列のものを格納します。 Firebaseで生成されたuidを使用することになりますが、簡単にするためにuid_0、uid_1などを使用します。

2人のユーザーだけで、2つのノードのそれぞれでSingleEventOfTypeを観察するだけでも大したことはありません。

ただし、100人のランダムユーザーまたは1,000人が必要な場合は、1000個の個別のクエリを実行するかobserveSingleEventを避ける必要があります。しかし、setValueは非常に高速です(返されたデータはありません)ので....

ユーザーの皆様には、私たちは、その後、真

for uid in uidArray { 
    let thisUserRef = usersRef.childByAppendingPath(uid) 
    let selectedRef = thisUserRef.childByAppendingPath("selected") 
    selectedRef.setValue(true) 
} 

に選択されたものレフリーとのセットを構築するために、配列を反復することによって私たちが望む100人のユーザーのそれぞれへのパスを知っている

let usersRef = myRootRef.ChildbyAppendingPath("users") 

をrefを取得選択した子がtrueのusersRef内のすべてのユーザーを照会できます。

あなたがそれらを持っていたら、返されたユーザーを反復処理し、クリーンアップし、falseに選択または

nilをこの程度のクールな事はsetValueのはオーバーヘッドなしで非常に迅速に100人のまたは1000のユーザによって爆破できるということです設定します選択した子を真に設定します。次に、1つのクエリで必要な値を返すことができます。

論理的には論理的に反転しているように見えますが、読み込みに戻ってきますが、配列を繰り返して1000個のクエリやオブザーバを生成するよりもかなり良いと思います。

(Firebaseの人々は、その1の私を確認することができます)

もう一つの考えは、ユーザーがリスト内の他のユーザーをクリックし、言うことであれば、彼らはをクリックして、クエリされているとして、あなたは= trueを選択設定することができますということですユーザが完了したときのためのものです。

+0

これはすばらしい革新的なソリューションです!どうもありがとう! – user3802348

0

余分なクエリ

+0

しかし、これはアイテムの全リストをつかむことはありませんか?私はそれらのサブセット、例えば特定のIDを持つアイテムだけを必要とします。 Firebaseに欲しいIDのリストを渡して、特定のアイテムの結果だけを取得する方法はありますか? – user3802348

関連する問題