2016-11-01 10 views
0

私が適切なインデックスを設定していないため、以下に示す現在のクエリは効率的ではありません。 Xcodeのコンソールに、Consider adding ".indexOn": "users/kxSWLGDxpYgNQNFd3Q5WdoC9XFk2" at /conversationsという提案があります。私はそれを試して、それは動作します。複雑なDB構造を持つFirebase .indexOn

しかし、users/の後にユーザーIDを動的にする必要があります。私は、同様のことを試した後の別の記事へのリンクを追加しましたが、私はそれを得ることができません。すべての助けが大いに評価されるだろう!

注:上記のコンソール出力ユーザIDは、下記のスクリーンショットと一致しませんが、私が思うような問題を解決するためには問題ありません。私が間違っているなら私を訂正してください。ありがとう!ここで

はFirebaseの私のDBの構造である:

{ 
    "conversationsMessagesID" : "-KS3Y9dMLXfs3FE4nlm7", 
    "date" : "2016-10-19 15:45:32 PDT", 
    "dateAsDouble" : 4.6601793282986E8, 
    "displayNames" : [ “Tester 1”, “Tester 2” ], 
    "hideForUsers" : [ "SjZLsTGckoc7ZsyGV3mmwc022J93" ], 
    "readByUsers" : [ "mcOK5wVZoZYlFZZICXWYr3H81az2", "SjZLsTGckoc7ZsyGV3mmwc022J93" ], 
    "users" : { 
    "SjZLsTGckoc7ZsyGV3mmwc022J93" : true, 
    "mcOK5wVZoZYlFZZICXWYr3H81az2" : true 
    } 
} 

とスウィフトクエリ:他のポストへ

FIRDatabase.database().reference().child("conversations") 
    .queryOrderedByChild("users/\(AppState.sharedInstance.uid!)").queryEqualToValue(true) 

リンク: How to write .indexOn for dynamic keys in firebase?

+1

あなたの質問にJSONツリーの画像が含まれています。 Firebaseデータベースコンソールの[エクスポート]ボタンをクリックすると、実際のJSONをテキストとして置き換えてください。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

完了! @FrankvanPuffelen – justColbs

+0

あなたはそれをどのように編集したか分かります。そのようにする方法を正確には知らなかった。本当にありがとう! – justColbs

答えて

3

それはかなり単純なようです要求されたインデックスを追加する:

{ 
    "rules": { 
    "users": { 
     ".indexOn": ["kxSWLGDxpYgNQNFd3Q5WdoC9XFk2", "SjZLsTGckoc7ZsyGV3mmwc022J93", "mcOK5wVZoZYlFZZICXWYr3H81az2"] 
    } 
    } 
} 

あなたのコードにユーザーIDを生成しているので、これらのインデックスを手動で追加することは現実的ではない可能性があります。

残念ながら、インデックスを生成するAPIはありません。

代わりに、実行するクエリが異なるようにデータをモデル化する必要があります。この場合、特定のユーザーの会話を取得する必要があります。だから、それぞれの特定のユーザーのための会話を保存する必要があります:

conversationsByUser { 
    "SjZLsTGckoc7ZsyGV3mmwc022J93": { 
     "-KS3Y9dMLXfs3FE4nlm7": true 
    }, 
    "mcOK5wVZoZYlFZZICXWYr3H81az2": { 
     "-KS3Y9dMLXfs3FE4nlm7": true 
    } 
} 

最初にこのデータを複数回保存するために非効率的に見えるかもしれませんが、NoSQLのデータベースを使用している場合、それは非常に一般的です。そして、インデックスを自分で更新するコードを書かなければならないという点を除いて、データベースがあなたのためにインデックスを自動生成するかどうかはまったく変わりません。

+0

私はこれを恐れていたが問題はなかった。クイッククライアントの変更は、そのトリックを行う必要があります。ありがとうございます! Firebaseコミュニティで本当に助けてくれてありがとう。 – justColbs

+0

Frank新しいモデルの例でセキュリティルールがどのように見えるのかわかりません。インデックスはどのようなものになりますか? – justColbs

+0

インデックスを定義する必要はありません。ユーザーに直接アクセスして会話のリストを取得するだけでよいからです。 'ref.child(" conversationByUser ")。child(user.uid)' –

関連する問題