2

ブログサイトのニュースフィードをデザインしています。私はフィードを設計しようとしているので、友達からの最近のアクティビティを含むブログは、それらのブログをフィードの一番上に保持しますが、参加していないフィードはリストの一番下に向かっていきます。基本的に、Facebookフィードについて考えてみてください。ただし、ブログ用です。

これが私が持っている現在のデザインですが、これを選択しやすくするための提案を受け付けています。

{
_id: 1,
author: {first: "John", last: "Doe", id: 123},
title: "This is a test post.",
body: "This is the body of my post."
date: new Date("Feb 1, 2013"),
edited: new Date("Feb 2, 2013"),
comments: [
    {
        author: {first: "Jane", last: "Doe", id: 124},
        date: new Date("Feb 2, 2013"),
        comment: "Awesome post."
    },
],
likes: [
    {
        who: {first: "Black", last: "Smith", id: 125},
        when: new Date("Feb 3, 2013")
    }
],
tagged: [
    {
        who: {first: "Black", last: "Smith", id: 126},
        when: new Date("Feb 4, 2013")
    }
]}

質問1:友達のIDが124と125だとすると、フィードを選択して、結果のこの投稿の順序が、後でフィードでタグ付けされたユーザー126ではなく、友達によるものになるようにするにはどうすればよいですか。

質問2:このブログの単一のコレクションは優れたデザインですか、それともアクションを別のコレクションに正規化する必要がありますか?

4

1 に答える 1

2

それで、あなたが示すこの文書は1つのブログ投稿を表しており、それらはコメント、タグ、いいねなどですか?その場合、これはそれほど悪くはありません。

1.1。

db.posts.find({'$or':[{'comments.author.id':{$in:[some list of friends]}}, {'likes.who.id':{$in:[some list of friends]}}, {'tagged.who.id':{$in:[some list of friends]}}]}).sort({date:-1})

これにより、すべての友達がアクティビティを行っている投稿が、投稿の日付の降順で並べ替えられます。mongodbはまだ高度な並べ替え(コメント、いいね、タグの日付の最小/最大など)をサポートしていないと思います。そのため、コメント、いいね、タグのいずれかによる並べ替え、または投稿日の並べ替えがこのモデルの最善の策です。

2.2。

個人的には、ユーザーのフィードイベントをにダンプするための別のコレクションを設定します。次に、イベントが発生したら、そのイベントをドキュメント内のイベントの配列にプッシュします。

それらは自動的にソートされ、必要に応じて配列をスライスしてキャップすることができます。

ただし、そのように大きくなるドキュメントでは、注意して初期のかなりの量のメモリを割り当てる必要があります。そうしないと、ディスク上でドキュメントの移動が遅くなります。

アップデートの宣伝文を見る

追加のコメントを編集します。

それを行うには2つの方法があります。すべてのドキュメントがフィードイベントであるコレクション、またはすべてのドキュメントがユーザーのフィード全体であるコレクション。それぞれに長所と短所があります。たとえば、最近の1000件のフィードイベントで上限を設定しても問題がない場合は、このドキュメントを使用してフィードメソッド全体を表します。

だから私は次のようなドキュメント構造を作成します

{userid:1, feed:[(feed objects)]}

ここで、feedはフィードイベントオブジェクトの配列です。これらは次のようなサブドキュメントである必要があります

{id:(a users id), name:(a users name), type:(an int for like/comment/tag), date:(some iso date), postName:(the name of the post acted on), postId:(the id of the post acted on)}

このフィードを更新するには、フィードイベントが発生したときに、新しいフィードドキュメントをフィード配列にプッシュする必要があります。したがって、ユーザーAが投稿を気に入った場合は、フィードドキュメントをユーザーAのすべての友達フィードにプッシュします。

これは小さなフィードに適しています。非常に大きなフィードが必要な場合は、フィードエントリごとにドキュメントを使用し、受信者ユーザーのIDをシャーディングして、日付フィールドにインデックスを付けることをお勧めします。これは、twitter / fbの非常に大きなフィードがどのように機能するかに近づいていますが、この特定のユースケースでは、mongodbよりも間違いなく優れたmysqlを使用しています。

于 2013-02-28T22:06:02.697 に答える