1

私はMongoDBを使用していますが、最終的に2つのコレクションになりました(意図せず)。

最初のコレクション (サンプル) には、次の構造を持つ 1 億件のレコード (ツイート) があります。

{
"_id" : ObjectId("515af34297c2f607b822a54b"),
"text" : "bla bla ",
"id" : NumberLong("314965680476803072"),
"user" : 
       {
        "screen_name" : "TheFroooggie",
        "time_zone" : "Amsterdam",
       },
}

2 番目のコレクション (users) には、ツイート コレクションからの 3,000 万件のユニーク ユーザーのレコードが含まれており、次のようになります。

{ "_id" : "000000_n", "target" : 1, "value" : { "count" : 5 } }

ここで、users コレクションの _id はつぶやきコレクションの user.screen_name であり、ターゲットはステータス (スパマーかどうか) であり、最後に value.count は最初のコレクション (サンプル) コレクションに表示されたユーザーの数です (例: numberキャプチャされたツイートの

ここで、次のクエリを作成したいと思います。

ユーザーがターゲット値 = 1 を持つサンプル コレクション (ツイート) からすべてのドキュメントを返したい

つまり、たとえば、すべてのスパマーのすべてのツイートを返したいとします。

4

1 に答える 1

1

ツイートを受け取ったら、それらをコレクションにアップサートできます。更新の「クエリ」ドキュメント部分のキーとして作成者情報を使用します。更新ドキュメントは、$addToSet演算子を使用してつぶやきをつぶやき配列に入れることができます。作成者とつぶやきの配列を持つコレクションが完成します。次に、作成者ごとにスパマー分類を行い、関連するツイートを取得できます。

したがって、次のようなことを行うことになります。

db.samples.update({"author":"joe"},{$addToSet:{"tweets":{"tweet_id":2}}},{upsert:true})

このアプローチには、ドキュメントがディスク上で最初に割り当てられたサイズを超えて大きくなる可能性があるという欠点があります。つまり、ドキュメントはディスク上で移動および拡張されます。インデックスの更新にも何らかのペナルティが発生する可能性があります。

各ツイート ドキュメントでスパム評価を保存し、後でユーザー ID に基づいてそれらを取得するというアプローチを取ることもできます。

他の人が指摘しているように、適切なインデックスを設定し、カーソルを使用してユーザーがツイートをプルすることをループすることには何の問題もありません。

選択するアプローチは、意図したアクセス パターンに基づいている必要があります。いくつかの異なる可能な解決策を試すことができる良い場所にいるようです.

于 2013-04-28T14:58:08.947 に答える