2017-12-13 7 views
0

私はまだ成長している約500万のドキュメントを持つコレクションを持っています。これらの文書にはすべて、場所フィールドがあります。ロケーションフィールドにもインデックスがあります。これらの文書は地図上に表示されます。私がズームインしているときは、表示領域の境界内の点を限度で検索します。ズームアウトすると、x点を表示したいが、すべてを1つの領域に表示する必要はない(xは総コレクションよりもずっと小さい)。私はdbから20番目の要素ごとにリターンのようなものを実装したいので、高いズームレベルでの良い概観でなければならないすべての領域でポイントを取得します。私は今のようなものを持っていますが、それは機能しますが、それはすべてのアイテムを繰り返しているので、あまり速くはありません。mongodbカーソルからすべてのx番目の要素を取り出す効率的な方法

let itemCount = 0; 
let someItems = []; 
cursor.forEach((item) => { 
    if (!(++itemCount % 20)) someItems.push(item); 
}, (err) => { 
    if (err) throw err; 
    res.json(someItems); 
}); 

現在の実装では、ユーザーが私の意見で待機するには長すぎる5秒がかかります。カーソル項目をスキップする機能がありますか?私は、カーソルが使用するバッチについて読みました。 batchSizeが20の場合は、すべてのバッチの最初の項目を取ることができます。私は手動で次のバッチを取得する方法を見ていない。この操作の速度を向上させるにはどうすればよいでしょうか?

PS。私はNode.js MongoDBネイティブドライバを使用しています。

答えて

1

ランダム化されたスキップリストに類似したものを使用できます。基本的には、そのようなアイテムを挿入するたびに、ランダムに「可視性」を割り当てます。可視性が高いほど、その可視性を持つアイテムは少なくなります。

{ 
    "name": "apple", 
    "visibility": 0, 
}, 
{ 
    "name": "orange", 
    "visibility": 0, 
}, 
{ 
    "name": "banana", 
    "visibility": 1, 
}, 
{ 
    "name": "mango", 
    "visibility": 2, 
}, 

あなたは、あなたのインデックスを設計し、両方の位置に基づいてクエリを行うとすることができます

たとえば、あなたがそうのような一連の文書になってしまった後、visibility = floor(log2(random(2^10)))

セイを使用することができます可視性。クエリの最小限の可視性を高めて、アイテムをより疎に戻すようにします。

+0

これは良い考えのようです。したがって、基本的には視認性に基づいてクエリを実行し、視認性が高いほどズームし、視認性が低い場合は、すべてを表示する最低のズームに達するまで視認性を下げます。 – Marco

+0

これはいい考えです – hedgepigdaniel

関連する問題