2017-02-11 137 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: - 该$组流水线阶段加入只是为了得到计数,因此在交代没有写关于它