MongoDB $geoNear 聚合管道(使用查询选项和使用 $match 管道操作)给出不同的结果

Aks*_*hta 7 geospatial mongodb 2dsphere

我使用 $geoNear 作为聚合框架的第一步。我需要根据“标签”字段过滤掉结果,它工作正常,但我看到有两种方法可以给出不同的结果。

示例 MongoDB 文档

    {
      “位置”: [
        40.80143,
        -73.96095
      ],
      “标签”:“披萨”
    }

我已将 2dsphere 索引添加到“位置”键

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

查询 1

使用 $match 聚合管道操作根据“标签”键过滤结果
    db.restaurants.aggregate(
      [
       {
           “$geoNear”:{

               “附近”:{类型:“点”,坐标:[55.8284,-4.207]},
               “限制”:100,
               “最大距离”:10*1000,
               "distanceField": "dist.calculated",
               "includeLocs": "dist.location",
               “距离乘数”:1/1000,
               “球形”:真实
        }
       },{
           "$match":{"tag":"pizza"}
       },

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

查询 2

在 $geoNear 聚合操作中使用查询根据“标签”键过滤结果
    db.restaurants.aggregate(
      [
       {
           “$geoNear”:{
               “查询”:{“标签”:“披萨”}
               “附近”:{类型:“点”,坐标:[55.8284,-4.207]},
               “限制”:100,
               “最大距离”:10*1000,
               "distanceField": "dist.calculated",
               "includeLocs": "dist.location",
               “距离乘数”:1/1000,
               “球形”:真实
        }
       },
       {
          "$group":{"_id":null,"totalDocs":{"$sum":1}}
       }
      ]
    );

分组选项只是获取两个查询返回的文档数。

两个查询返回的 totalDocs 似乎不同。

有人可以向我解释这两个查询之间的区别吗?

Aks*_*hta 7

几个假设:-
1. 假设有 300 条记录匹配基于位置。
2. 假设第一组 100 个结果没有标签披萨。其余 200 个文档(101 到 300)有标签披萨

查询 1:-

  • 有 2 个管道操作 $geoNear 和 $match
  • $geoNear 管道操作的输出是 $match 管道操作的输入
  • $geoNear 根据按最近到远距离排序的位置查找最多 100 个结果(我们指定的限制)。(注意这里返回的 100 个结果纯粹是基于位置的。所以这 100 个结果不包含任何带有“pizza”标签的文档)
  • 这 100 个结果被发送到下一个管道操作 $match,从那里进行过滤。但是由于第一组 100 个结果没有标签pizza,所以输出为空

查询 2:-

  • 只有 1 个管道操作 $geoNear
  • $geoNear 管道操作中包含一个查询字段 $geoNear 根据按从最近到远距离排序的位置和查询 tag=pizza 查找最多 100 个结果(我们指定的限制)
  • 现在这里从 101 到 200 的结果作为输出返回,因为查询包含在管道操作 $geoNear 中。所以用简单的句子我们说,找到所有位置为 [x,y] 且 tag=pizza 的文档。

PS : - 添加 $group 管道阶段只是为了获取计数,因此没有在解释中写到它