1

mongodb(pymognoドライバー)でのクエリで問題が発生しました。

ここに私の問題があります:私は1日あたり約1億(100000000)のドキュメントをmongodbに挿入(更新)する必要があります。追加を更新する必要があるのと同じキーフィールドの更新の使用をあきらめ、一括挿入を使用するように修正しました(更新のパフォーマンスは一括挿入よりも遅くなります)。

これが私のデータベースのスケッチスキームです。

{_id:xxx, F1:1 , F2:"test1", TS": 2011/01}
{_id:xxx, F1:1 , F2:"test2", TS": 2011/02}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/03}
{_id:xxx, F1:3 , F2:"test1", TS": 2011/04}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/05}
.....
(4 billion up or more)

クエリを実行するとき、F1(field1)で最新のTSグループを取得したいだけです。

「グループ」集約フレームワークがそれを実行できることは知っていますが、データベースをシャーディングしており、データベースのシャーディングでグループ操作を許可していません。

また、map-reduceを使用してそれを実行しようとしましたが、十分なクエリパフォーマンスが得られません。

私が使用している唯一のクエリは「$in」操作です。

db.test.find({"F1":{"$in":[1,2,3,....]}})

ターゲット配列内のすべてのドキュメントを取得しますが、キーF1ごとに最新のドキュメントのみを取得したいと思います。

{_id:xxx, F1:1 , F2:"test2", TS": 2011/02}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/05}
{_id:xxx, F1:3 , F2:"test2", TS": 2011/03}

どうすればそれを取得できますか?

ps。ターゲット配列には、一括クエリしたい100万個の要素が含まれている可能性があります。

それを行う良い方法はありますか?

4

1 に答える 1

0

あなたが言及したようにシャードで集約フレームワークを使用できないため、この問題に対する単一のステップの解決策はありませんが (使用したとしてもうまく機能しない可能性があります)、次のような解決策を検討することをお勧めします。

  • インデックスとして使用される新しいドキュメント コレクションを作成します (実際の MongoDB インデックスではありません)。
  • このコレクション内に、一意の F1 値ごとに 1 つのドキュメントを保存します。ドキュメントには、プライマリ コレクション内の最新のドキュメントへの参照が含まれています。条件付き更新を使用して、(必要に応じて) インデックス ドキュメントを作成したり、更新したりできます。クエリを使用してドキュメントを検索し、タイムスタンプがその値に対して挿入されている最新のドキュメントよりも小さい (または等しい) 場合にのみ一致させます。(多分
  • 次に、「インデックス コレクション」を使用して、各 F1 値の最新のドキュメント参照を取得します。
于 2013-01-18T18:37:59.857 に答える