2017-02-11 131 views
1

我正在使用$ geoNear作爲聚合框架中的第一步。我需要根據「標記」字段篩選出結果,它工作正常,但我看到有兩種方法給出不同的結果。

樣品的MongoDB文獻

 

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

我已經加入2dsphere索引的 「位置」 鍵

 

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

查詢1

使用$匹配aggregration流水線操作基於「標籤」鍵
 

    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}} 
     } 
     ] 
    ); 

查詢2

使用查詢$ geoNear聚合操作裏面篩選基於結果篩選出結果「tag」鍵
 

    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個文件(101至300)有標籤的比薩餅

查詢1: -

  • 有2個流水線作業$ geoNear和$匹配
  • $ geoNear流水線操作的輸出是$匹配的輸入 流水線操作
  • $ geoNear會根據 找到最多100個結果(我們指定的限制),按距離最近的距離排序。 (請注意,這些結果是純粹基於位置的,因此這些結果不包含任何帶有標籤「披薩」的文檔)
  • 這100個結果被髮送到下一個管道操作$匹配 其中過濾發生。但是,由於第一組的100個結果 沒有標籤比薩餅,輸出是空

查詢2: -

  • 只有1流水線操作$ geoNear
  • $ geoNear管道操作中包含一個查詢字段 $ geoNear根據 查找最多100個結果(我們指定的限制),該位置按距離最近的距離排序,查詢 tag = pizza
  • 現在這裏從101到200的結果作爲輸出返回,因爲 查詢包含在管道操作$ geoNear中。因此,在 簡單的句子,我們說,找到與位置[x,y]與 標記=披薩的所有文件。

P.S: - 該$組流水線階段加入只是爲了得到計數,因此在交代沒有寫關於它