22

での作業は、最近、私はFirebaseからFirestoreに自分のデータモデルを移動しました。すべてのコードが動作していますが、いくつかのデータを取得するためにネストされたクエリに関していくつかの醜い問題があります。ここでのポイントは次のとおりです。Firestore:ネストされた単一のクエリ

今のこの部分のための私のデータモデルは、(はい!もう信者/例を養う)次のようになります。

{ 
    "Users": { //Collection 
    "UserId1" : { //Document 
     "Feed" : { //Subcollection of Id of posts from users this user Follow 
     "PostId1" : { //Document 
      "timeStamp" : "SomeDate" 
     }, 
     "PostId2" : { 
      "timeStamp" : "SomeDate" 
     }, 
     "PostId3" : { 
      "timeStamp" : "SomeDate" 
     } 
     } 
     //Some data 
    } 
    }, 
    "Posts":{ //Collection 
    "PostId1":{ //Document 
     "Comments" :{ //Subcollection 
     "commentId" : { //Document 
      "authorId": "UserId1" 
      //comentsData 
     } 
     }, 
     "Likes" : { //Subcollection 
     "UserId1" : { //Document 
      "liked" : true 
     }  
     } 
    } 
    } 
} 

[OK]を、今私の問題は、のためには、の記事を取得することです私は次のように照会するユーザーのフィード:

  • が私のフィードからのタイムスタンプで最後のX文書の発注を取得

その後

  • 私は、リストから検索された各ポストの単一のクエリを実行する必要があります。workoutPostCol.document(postId)

  • は今、私は、各ポストのデータを持っているが、私は、ユーザー名、画像、ポイントを撮影したいと思います。 。など異なるDocumentである著者の、そう、再び私はポストuserSocial(userId).document(toId)

  • 最後に、そして以下に重要なのリストで検索された各authorIdのために別の単一のクエリを行う必要があり、私は私の場合は知っている必要があります現在のユーザーは既にその投稿を好きでしたが、私はすべてが動作しますが、Firestoreの価格は、データベースの呼び出しの数に依存していることを考えている各ポストのための単一のクエリを実行します(再び)と私のuserIdがposts/likes/{userId}

内にある場合は今のところ確認する必要がありますそれは私のデータモデルは、データベースのこの種の良くないだけということだと私は再び戻ったばかりFirebaseに通常SQLに移動したりする必要がある場合、また、それは私のクエリは、より簡単なことはありませんので、私は知りません。

:私はすべてが、より多くのより簡単に自分のユーザーまたはポスト文書内のArrayListのが好き、飼料などのこのサブコレクションを移動されることを知っているが、文書の制限が1メガバイトであり、この場合多くに成長する、それは将来クラッシュするだろう。一方でFirestore doesntのは、サブ文書(まだ)クエリまたは複数whereEqualToを用いOR句を可能にします。

私は素晴らしいだろう Arraylistsを使用し、その Collectionsjoinsqueriesを作るために ID's関係のこの種を保存するための簡単な方法を探している問題を抱えているユーザーからの投稿をたくさん読みましたが、1メガバイトの制限は、それを制限

過ぎる。

誰かが私の心を明確にすることができ、または少なくとも私に新しい何かを教える、多分私のモデルはちょうどがらくたされ、これを実行するためのシンプルかつ最も簡単な方法があることを願っています。あるいは、私のモデルは非SQLデータベースでは不可能かもしれません。

は良い一日を、すべてありがとうございました。

答えて

7

なく、あなたの使用のためのエッジケースがあるかもしれないので、これは、問題を完全に解決した場合は100%を確認してください。しかし、5分の素早い思考で、私はあなたの問題を解決できると思っています:

Instagramに似たモデルの使用を検討することができます。私の記憶が私によく役立つなら、彼らが使っているものはeventsベースのコレクションです。この特定の文脈におけるeventsは、ユーザが取るすべての動作を意味する。したがって、commentはイベントです。likeはイベントなどです。

これにより、合計3つの主要なコレクションが必要になります。ユーザーバイオページについては

users 
-- userID1 
---- userdata (profile pic, bio etc.) 
---- postsByUser : [postID1, postID2] 
---- followedBy : [userID2, ... ] 
---- following : [userID2, ... ] 
-- userID2 
---- userdata (profile pic, bio etc.) 


posts 
-- postID1 (timestamp, so it's sortable) 
---- contents 
---- author : userID1 
---- authorPic : authorPicUrl 
---- authorPoints : 12345 
---- taggedUsers : [] 
---- comments 
------ comment1 : { copy of comment event } 
---- likes : [userID1, userID2] 
-- postID2 (timestamp) 
---- contents 
... 


events 
-- eventID1 
---- type : comment 
---- timestamp 
---- byWhom : userID 
---- toWhichPost : postID 
---- contents : comment-text 
-- eventID2 
---- type : like 
---- timestamp 
---- byWhom : userID 
---- toWhichPost : postID 

、あなたはusersを照会します。

あなたは、あなたのユーザーは、最後の1日(または任意のタイムスパン)に従っているのユーザーIDによるアクティビティフィードのページについては

(コメント/好きなど)すべての投稿postsを照会うニュースフィードの

あなたは

最後にユーザーがスクロールなどの記事/イベントのために次の日照会(またはそれらの日には、新たな活動はありません場合は)最後の1日(または任意のタイムスパン)に制限されたユーザーIDに関連している events

を照会します

これもやはり簡単なことですが、私はSOFの長老を知っていますha通常、これらのcrucifyingの習慣VEのため、この答えは欠陥を持っている場合は、私にSOFの仲間のメンバーを許す:)

、それはサンフランシスコを助け幸運を願っています!

+0

私は 'events'部分が好きです。私は、通知が一度だけ送られるように制御するために、そのようなものを考えました。一方、私はすでにデータを非正規化すべきであることを見てきました(IDの代わりにusernameとphotoUrlを保存します)。ユーザーは名前や画像を変更しないことが多く、最終的には無限のネストされたクエリ投稿、コメント、好きなものなど... –

+0

最後に私は、「フィード」のために、私が従う各ユーザの投稿への参照のリストにとどまるべきだと思います。すべてのIDが大量のクエリを作成するよりも簡単になり、フィードを確認したい毎回の各ユーザーの最後の投稿をすべて取得できます。 –

+1

@FranciscoDurdinGarcia - 私がinstagramのAPIを提案したのは、 'events'メソッドを使用することによってそれらを軽く保つことができると信じているからです。あなたが従うユーザーによるすべての投稿のリストを保持することに関しては、それは逆のデータモデルを必要とするので、滑りやすい斜面です。あなたが私に従っていると言って、私は投稿をします。これにより、ユーザーにデータを書き込む必要があります。セキュリティをより複雑にすることを除いて、このソリューションでは、200kのフォロワーがあれば、私のユーザーは1人の投稿を200kの他のユーザーのプロフィールに書き込む必要があります。私はあなたの推定された規模に基づいてその部分を選んでいます。 – johnozbay

関連する問題