0

次のmongoクエリがあります(PHPで記述)

 $q = array("created_at" => array("\$gte" => $mdate), "icv" => 1, "loc" => array("\$near" => array($latitude, $longitude), "\$maxDistance" => 5));

基本的には次のとおりです。

db.collection.find({loc: {$near: [XX,YY]}, $maxDistance: 5}, "vid": 1, "created_at":{$gte: "SOMEDATE"}});

デフォルトで返される 100 件だけでなく、このクエリに一致するすべてのドキュメントを検索したいと考えています。このクエリで を設定するlimitと、距離の外側に出ます。

助言がありますか?

4

1 に答える 1

1

このメーリング リストへの投稿で、Eliot はカーソルを使用しないと述べている$nearため、その結果は 4MB または 100 ドキュメントのどちらか先に到達した方に制限されます。現在のドキュメントでは同じことが述べられていますが、これは 2D インデックスにのみ当てはまります (ドキュメントはDOCS-1841によって修正される必要があります)。

GeoJSONにポイントを保存し、2dsphere インデックス(バージョン 2.4 の新機能)を使用している場合、$nearクエリはカーソルを使用し、100 ドキュメントの厳密な上限を設定しないでください。

最初に 2d インデックスを使用して、次の例を検討してください。

> var point = [0,0];
> for(i=0;i<200;i++) db.foo.insert({x: point});
> db.foo.ensureIndex({x: "2d"});
> db.foo.find({x: {$near: point}}).count(true);
100
> db.foo.find({x: {$near: point}}).limit(200).count(true);
100

次に、同等のポイント データを持つ 2dsphere インデックスを使用します。

> var point = {type: "Point", coordinates: [0,0]};
> for(i=0;i<200;i++) db.bar.insert({x: point});
> db.bar.ensureIndex({x: "2dsphere"})
> db.bar.find({x: {$near: point}}).count(true)
200
> db.bar.find({x: {$near: point}}).limit(150).count(true)
150
于 2013-08-20T18:27:09.220 に答える