2016-08-10 4 views
0

MongoDBpymongoを使用してリーダーボードタイプのアプリケーションを構築しようとしています。これは、sortlimitを使って、トップとボトムのユーザーをかなり簡単に見分けることができます。ソートされたMongoコレクションの文書の位置を見つける

私の問題は、コレクションの途中にいるユーザーを検索する場合です。注文したコレクションのどの位置にユーザーがいるのかを判断できるクエリを作成するにはどうすればよいですか?例えば、このデータセットを使用して

{user: 'A', value: 20} 
{user: 'B', value: 10} 
{user: 'C', value: 5} 
{user: 'D', value: 4} 
{user: 'E', value: 1} 

は、どのように私たちは{user: 'C'}を探している与えられた、それだけではなく、ユーザーのドキュメントを返しますが、また、ユーザーが順序付けられたリストで3番目であることを、クエリを構築するのでしょうか?

次の質問は、一度私がこれを持っていると、ユーザーBDがそのユーザーの周りの場所にいると判断するにはどうすればよいですか?

私は既にアプリケーション全体にリストを引き込み、それを使って簡単に検索する方法を知っていますが、この問題に対する間違った/高価な答えのようです。

答えて

1

おそらく、これに気をつける最もよい方法は、2つのクエリを実行することです。最初のクエリは、現在のユーザーの値を取得することです。その値を使用して、そのクエリから一定の値を減算/加算して、$gtと$ lt``を使用して近い値のユーザーの範囲を導出します。

範囲内に値がない可能性があるので、それを考慮に入れて、追加のクエリを実行する必要があるかもしれません。

しかし、これは実際にあなたにあなたが求めているランクを与えるわけではありません。値が(ある種のスコアであると仮定して)比較的有限であれば、隣接する範囲が何であるかを知るために使用できる個々のスコア値を持つ1つ以上のドキュメントを格納できます。同様の考えを提案するblog postがあります。

大規模なコレクションを読み取って位置を取得すると、非効率的になり、大型の場合は受け入れられない可能性があります。nしかし、あなたの問題のスコープ/規模に応じて、受け入れられ、最も簡単な選択肢になります。

+0

定期的に実行される何らかのクリーンアップジョブでは、素朴なアプローチが高すぎることがわかっている場合は、そのことを念頭に置いておきます。 – EEP

関連する問題