当前位置: 首页 > 知识库问答 >
问题:

MongoDB$Geonear聚合流水线(使用查询选项和使用$match流水线操作)给出不同的结果no

窦伟
2023-03-14

我使用$geonear作为聚合框架的第一步。我需要过滤掉基于“标签”字段的结果,它工作得很好,但我看到有两种方式都给出了不同的结果。

MongoDB文档示例


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

我已经向“Position”键添加了2dSphere索引


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


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


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

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

有人能给我解释一下这两个查询之间的区别吗?

共有1个答案

公良飞尘
2023-03-14

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

查询1:-

  • 有两个管道操作$geonear和$match
  • $geonear管道操作的输出是$match管道操作的输入
  • $geonear根据位置按最近距离和远距离排序,查找最多100个结果(我们已经指定了限制)。(这里注意,100个结果完全基于位置。因此,这100个结果不包含任何标记为“pizza”的文档)
  • 这100个结果被发送到下一个管道操作$match,从那里进行筛选。但是由于第一组100个结果没有标记pizza,所以输出为空
    null
 类似资料:
  • 有人遇到过聚合管道的问题吗?特别是使用Mongo API?我有一个包含几个阶段的大型查询,$group阶段无法在前一个$project阶段的输出中找到特定的字段,尽管如果我注释掉$group阶段,我肯定可以看到我希望作为$project一部分输出的字段。 下面设置了两个集合,每个集合都有一个文档用于演示目的。 以下是聚合管道查询: 我在使用MongoDB时得到以下结果: null

  • 我使用的是spring data mongodb,我想使用光标进行聚合操作。 MongoTemplate.stream()得到一个查询,所以我尝试创建聚合实例,使用ggregation.toDbObject()将其转换为DbObject,使用DbObject创建BasicQuery,然后调用stream()方法。 这返回一个空光标。 调试spring数据mongodb代码显示MongoTempla

  • 流水线功能提供给用户统一的视图来管理应用自动发布规则,您可通过此功能来自动发布自有主机或DCE混合云环境下的应用 设置自动发布规则 进入构建项目页,选择流水线 点击右侧 development 面板中的添加一个新应用, 输入应用的名字,我们可以搜索到使用该项目的应用 点击应用的“设置发布规则”来设置自动部署规则。 根据此规则,当源码的 master 分支更新时会自动触发CI与构建,并自动发布新版本

  • 本文向大家介绍StackExchange.Redis 流水线和多路复用,包括了StackExchange.Redis 流水线和多路复用的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 主要内容:实例,实例,实例,实例,实例,实例关键词:流水线,乘法器 硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。 但是当数据串行输入时,指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期内执行完毕,如果每次输入的串行数据都需要等待上一次计算执行完毕后才能开启下一次的计算,那效率是相当低的。流水线就是解决多周期下串行数据计算效率低的问题。 流水线 流水线的基

  • 问题内容: 我必须用Java实现HTTP客户端,并且出于我的需要,似乎最有效的方法是实现HTTP管道(按照RFC2616)。 顺便说一句,我想管道POST。(我也不在谈论多路复用。我在谈论流水线,即在接收到任何HTTP请求的响应之前,通过一个连接发送许多请求) 我找不到明确声明其支持流水线的第三方库。但是我可以使用例如Apache HTTPCore 来构建这样的客户端,或者如果需要的话,可以自己构