2017-02-11 4 views
1

集計フレームワークの最初のステップとして$ geoNearを使用しています。私は "タグ"フィールドに基づいて結果をフィルタリングする必要があり、それはうまく動作しますが、私は2つの方法が異なる結果を与えることがわかります。

サンプルMongoDBのドキュメント

 

    { 
     "position": [ 
     40.80143, 
     -73.96095 
     ], 
     "tag": "pizza" 
    } 

私は、 "位置" キー

 

    db.restaurants.createIndex({ 'position' : "2dsphere" }) 

クエリ1

に2dsphereインデックスを追加しましたは、キー「タグ」2

がオンに基づいて結果をフィルタリングする$ geoNear集約操作の内側にクエリを使用します
 

    db.restaurants.aggregate(
     [ 
     { 
      "$geoNear":{ 

       "near": { type: "Point", coordinates: [ 55.8284,-4.207] }, 
       "limit":100, 
       "maxDistance":10*1000, 
       "distanceField": "dist.calculated", 
       "includeLocs": "dist.location", 
       "distanceMultiplier":1/1000, 
       "spherical": true 
     } 
     },{ 
      "$match":{"tag":"pizza"} 
     }, 

     { 
      "$group":{"_id":null,"totalDocs":{"$sum":1}} 
     } 
     ] 
    ); 

クエリに基づいて結果をフィルタリングするために$マッチaggregrationのパイプライン動作を使用しています「タグ」キー

 

    db.restaurants.aggregate(
     [ 
     { 
      "$geoNear":{ 
       "query" : {"tag":"pizza"} 
       "near": { type: "Point", coordinates: [ 55.8284,-4.207] }, 
       "limit":100, 
       "maxDistance":10*1000, 
       "distanceField": "dist.calculated", 
       "includeLocs": "dist.location", 
       "distanceMultiplier":1/1000, 
       "spherical": true 
     } 
     }, 
     { 
      "$group":{"_id":null,"totalDocs":{"$sum":1}} 
     } 
     ] 
    ); 

グルーピングオプションはg両方のクエリによって返されたドキュメントの数。

両方のクエリによって返されるtotalDocsは異なるようです。

両方のクエリの違いを教えてもらえますか?

答えて

0

少数の仮定: -
1.位置に基づく一致300件のレコードがあると仮定する。
2. 100個の結果の最初のセットにタグピザがないとします。残りの200枚の文書(300から101)は、タグのピザを持って

クエリ1: -

  • 2つのパイプライン動作$ geoNearと$マッチ
  • $ geoNearのパイプライン動作の出力があります。 $一致の入力です パイプライン操作
  • $ geoNearは、 に基づいて、最大で100個の結果(指定した制限)を見つけます。これらの100個の結果は、次のパイプライン操作$ match から次の場所に送信されます。(ここで、 100個の結果は、場所のみに基づいています。フィルタリングが行われます。100の結果 の第1のセットは、タグピザを持っていなかったので、しかし、出力が空である

クエリ2: - わずか1パイプライン動作の$ geoNear

  • があり

    • $ geoNearパイプライン操作にクエリーフィールドが含まれています $ geoNearは、 に最も近い遠くの距離でソートされたクエリとに基づいて、最大で100個の結果(指定した制限)を見つけますtag = pizza
    • ここで、 クエリがパイプライン操作$ geoNearに含まれているため、101〜200の結果が出力として返されます。だから 単純な文章では、 タグ=ピザで位置[x、y]のすべての文書を見つける。

    P.Sは: - $グループのパイプラインステージは、単に数を取得するために添加され、したがって、について説明して、それについて書かれていない

  • 関連する問題