4

特定の境界内で結果を取得する必要があるPHPアプリケーションを開発していますが、距離ではなく結果の作成日で並べ替えられています。MongoDB の geoNear コマンドは、各結果の距離を計算してくれるので、これには最適だと思いました。ただし、距離ではなく、create_date 属性で並べ替えを指定する方法がないかどうか疑問に思っていました。理想的には、座標と作成日の複合キー インデックスを作成し、作成日順に並べられた特定の領域のすべての結果をすばやく取得します。

これは可能ですか、それともソート後のクエリを実行する必要がありますか?

4

2 に答える 2

5

ただ、距離ではなく、create_date属性でソートを指定する方法はないかと思っていたのですが...

コマンドを使用している場合$nearは、最初に距離でソートする必要があります。そうしないと、「近い」という概念が意味をなしません。地球上では、すべてが特定のポイントに「近い」場合があります。それは、「どれだけ近いか」の問題です。

ここには 2 つのオプションがあります。

  1. ~の結果を制限する$near
  2. $withinコマンドを使用する

あなたが探しているのは$withinコマンドだと思います

center = [50, 50]
radius = 10
db.places.find({"loc" : {"$within" : {"$center" : [center, radius]}}})

次に、これらを他のキーで並べ替えることができます。

db.places.find(...).sort({created:1})

ただし、inside コマンドでは結果が多すぎる可能性があるため、何らかのロジックを追加して、 によって返されるアイテムの数を制限する必要があるでしょう$within

db.places.find(...).limit(50).sort({created:1})

真実は、特定の制限に達すると、コマンドの値が$within一般的に低下し始めるということです。クライアント コードは、最大の結果に達しているかどうかを確認する必要がある場合があります。

于 2011-03-31T20:58:32.827 に答える
2

今のところ私が知っているように、デフォルトの並べ替えは$ nearコマンドで内部的に行われるため、変更できません。

ドキュメントからのいくつかのメモ:

db.places.find({loc:{$ near:[50,50]}})上記のクエリは、(50,50)に最も近いポイントを検索し、距離で並べ替えて返します(追加の並べ替えパラメーターは必要ありません)。 )。limit()を使用して、返すポイントの最大数を指定します(指定されていない場合は、デフォルトの制限である100が適用されます)。

したがって、コレクションを距離順にロードする必要があります。クライアントで必要な順序でロードする必要はありません。

もう1つの注意:距離でソートされた結果内の日付でソートしたい場合は、通常どおりにを使用して行うことができますsort( { date : -1 } )

于 2011-03-31T17:36:38.293 に答える