2017-03-13 8 views
0

私は少し質問があります。私は、ユーザーが投稿を好きな場所にソフトウェアを作成したい。今私は好きな人を救う方法が不思議だった。私はこのようにすることができます:MongoDB巨大な文書または複数のクエリ

{ 
    _id:"123456789", 
    text:"test", 
    likes:[ 
     { 
      username:"User1" 
     }, 
     { 
      username:"User2" 
     } 
    ] 
} 

私は内部の配列を持っています。しかし、私はこの投稿を照会したいと思うと、この投稿に大量の好きなものがあります。大量の配列を持つオブジェクト全体が毎回読み込まれます。そして、これは多くのパフォーマンスを必要とすると思います。利点は、私は投稿を取得することができますまた、私はこの投稿が好きかどうかをチェックします。

そして今、私は、このソリューションを持っている:

{ 
    _id="123456789", 
    text:"test" 
} 

これは持たず好きでポストです。そして、次のような別のコレクションで:

{ 
    _id="111111111", 
    username:"User1", 
    postId:"123456789" 
} 
{ 
    _id="222222222", 
    username:"User2", 
    postId:"123456789" 
} 

が好きです。利点は、小さなオブジェクトを読み込むことができますが、すべてのオブジェクトのようなディスクスペースを必要とすることです。そしてあなたは私がそれを好きだった投稿と情報を1つのクエリで取得することはできません。だから、私は1つのクエリだけで行くことができない20の投稿を取得したい場合、私は21が必要になります。

それでは、それとももっと良い解決策がありますか?そして、この問題はInstagramによってどのように解決されていますか?投稿を受け取り、あなたが好きかどうかを確認してください。1M以上のお気に入りを持っています。内側の配列は巨大です。

ありがとうございました!

答えて

1

あなたのスキーマデザインがドキュメント_idとして投稿され、内部配列のドキュメントとしてユーザーを追加すると、投稿に1Mのお気に入りなどがあり、内側の配列が巨大になるため、パフォーマンスに大きな影響を与えます。

私の好みの

代替アプローチ

が持つ2つのコレクションのユーザーとポスト

ユーザースキーマ

{ 
    _id: 1, 
    user_id: "1234ABC", 
    user_name: "MyFriend", 
    postsLiked: [ 
    { 
     post: 1 
    } 
    ], 
    postsDisLiked: [ 
    { 
     post: 2 
    } 
    ] 
} 

投稿スキーマ

{ 
    _id: 1, 
    post_name: "My first article", 
    author: "Best", 
    likesCount: 25, 
    dislikesCount: 10 
} 
{ 
    _id: 2, 
    post_name: "Why Bored", 
    author: "Best", 
    likesCount: 10, 
    dislikesCount: 7 
} 

このスキーマは、100万人のポストが頻繁に投稿できるという仮定に基づいて設計されていますが、ユーザーが好きなのは、100万ポンドの投稿が嫌いです。

我々は、ユーザーを表示したいと彼/彼女のビューのユーザー$lookup

希望で一緒に記事を嫌い/好きなら、我々は以下の

User likes a post 
    if post not exists in postsLiked array and post not in postsDisLiked array  
     Add the post in postsLiked array of User Document 
    if post in postsDisLiked array 
     Remove the post in postsDisLiked array and add it in postsLiked array 
    if post in postsLiked array 
     Do nothing 

User dislikes a post 
    if post not exists in postsLiked array and post not in postsDisLiked array  
     Add the post in postsDisLiked array of User Document 
    if post in postsLiked array 
     Remove the post in postsLiked array and add it in postsDisLiked array 
    if post in postsDisLiked array 
     Do nothing 

を行う必要があり好き嫌いのデータを維持するために助けになる!

+0

ありがとう、よさそうです。しかし、ユーザーの配列に投稿IDが含まれているかどうかを確認するために、$ lookupでbooleanを取得できますか?だから私は1つのクエリでそれを確認することができますか?私はそれが別のコレクションからいくつかの値を取得すると思うので、そうではありませんか? – user6586661

+0

$ exists - https://docs.mongodb.com/manual/reference/operator/query/exists/はブール値を取得するのに役立ちます。しかし、私が知る限り、1つのクエリでは確認と更新/削除はできません。 –

関連する問題