Mongodb 当前文档字段值内的地理空间$near

Mongodb 当前文档字段值内的地理空间$near,mongodb,mongodb-query,aggregation-framework,geospatial,spring-mongodb,Mongodb,Mongodb Query,Aggregation Framework,Geospatial,Spring Mongodb,以这个查询为例: { 'location' : { '$near' : [x,y], '$maxDistance' : this.field } } 我想为$maxDistance指定当前评估文档中指定字段的值。可能吗 是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读 假设您的目的是存储一个字段,如“travelDistance”,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件: 唯一的问题是,like首先只返回一定数量的“

以这个查询为例:

{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }

我想为$maxDistance指定当前评估文档中指定字段的值。可能吗

是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读

假设您的目的是存储一个字段,如
“travelDistance”
,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件:

唯一的问题是,like首先只返回一定数量的“near”文档。您可以使用选项对此进行调整,但与常规查询表单不同,这基本上保证了最终返回的结果将小于指定的“最近”数字

只要你意识到这一点,那么这是完全正确的

事实上,这是处理限定半径内“接近”的事物的一般方法

根据坐标的存储方式,还要注意“距离”。作为传统坐标对,距离将以弧度为单位,您可能需要进行数学运算以转换为公里或英里

如果使用GeoJSON,则作为标准格式,距离始终以米为单位

所有的数学笔记都在文档中

N.B仔细阅读文档。
“2dsphere”
索引需要像
“sphere”
这样的选项,比如真实世界坐标的选项。此外,可能需要应用“限制”以增加超过默认的100个文档结果,以便进一步调整


正如评论中提到的spring mongo一样,这里也做了同样的事情:

Aggregation aggregation = newAggregation(
    new AggregationOperation() {
      @Override
      public DBObject toDBObject(AggregationOperationContext context) {
        return new BasicDBObject("$geoNear",
          new BasicDBObject(
            "near", new BasicDBObject(
              "type","Point")
              .append("coordinates", Arrays.asList(20,30))
            )
            .append("spherical",true)
            .append("distanceField","distance")
          );
        }
    },
    new AggregationOperation() {
      @Override
      public DBObject toDBObject(AggregationOperationContext context) {
        return new BasicDBObject("$redact",
          new BasicDBObject(
            "$cond", Arrays.asList(
               new BasicDBObject("$lte", Arrays.asList("$distance", "$travelDistance")),
               "$$KEEP",
               "$$PRUNE"
             )
          )
       );
     }
    }
);

是的,这是可能的。你只要用它来代替。当心陷阱,仔细阅读

假设您的目的是存储一个字段,如
“travelDistance”
,以在文档上指示任何此类搜索必须在提供的距离查询点的“范围内”才能有效。然后,我们只需使用以下方法查询和评估条件:

唯一的问题是,like首先只返回一定数量的“near”文档。您可以使用选项对此进行调整,但与常规查询表单不同,这基本上保证了最终返回的结果将小于指定的“最近”数字

只要你意识到这一点,那么这是完全正确的

事实上,这是处理限定半径内“接近”的事物的一般方法

根据坐标的存储方式,还要注意“距离”。作为传统坐标对,距离将以弧度为单位,您可能需要进行数学运算以转换为公里或英里

如果使用GeoJSON,则作为标准格式,距离始终以米为单位

所有的数学笔记都在文档中

N.B仔细阅读文档。
“2dsphere”
索引需要像
“sphere”
这样的选项,比如真实世界坐标的选项。此外,可能需要应用“限制”以增加超过默认的100个文档结果,以便进一步调整


正如评论中提到的spring mongo一样,这里也做了同样的事情:

Aggregation aggregation = newAggregation(
    new AggregationOperation() {
      @Override
      public DBObject toDBObject(AggregationOperationContext context) {
        return new BasicDBObject("$geoNear",
          new BasicDBObject(
            "near", new BasicDBObject(
              "type","Point")
              .append("coordinates", Arrays.asList(20,30))
            )
            .append("spherical",true)
            .append("distanceField","distance")
          );
        }
    },
    new AggregationOperation() {
      @Override
      public DBObject toDBObject(AggregationOperationContext context) {
        return new BasicDBObject("$redact",
          new BasicDBObject(
            "$cond", Arrays.asList(
               new BasicDBObject("$lte", Arrays.asList("$distance", "$travelDistance")),
               "$$KEEP",
               "$$PRUNE"
             )
          )
       );
     }
    }
);


不,这是不可能的。你不是第一个问这个问题的人:)@SergioTulentsev那么你读错了帖子。这已经有一段时间了。NeilLunn:好吧,这个确切的需求可以用另一种方式来满足,但是一般问题(“我可以在查询中使用文档的字段吗?”)的答案仍然是“不”。@SergioTulentsev不,一般的答案是使用
$redact
或者更糟的
$where
。一直都是。不,这是不可能的。你不是第一个问这个问题的人:)@SergioTulentsev那么你读错了帖子。这已经有一段时间了。NeilLunn:好吧,这个确切的需求可以用另一种方式来满足,但是一般问题(“我可以在查询中使用文档的字段吗?”)的答案仍然是“不”。@SergioTulentsev不,一般的答案是使用
$redact
或者更糟的
$where
。一直都是,很有效,谢谢。但我现在有另一个问题,因为我使用的是SpringDataMongoDB框架,它仍然不支持$redact:(@LiLou_u)它可能没有“helper”方法,但您始终可以使用DBObject input将自己的pipeline stage实现为一个抽象。关于这一点,在这个网站上有几个答案。我知道,因为我已经写了其中的一些。@LiLou_u添加了Spring Data Mongo的翻译,并在问题上包含了标记。如您所见,添加自定义pipeline stage和语句相当简单le.此聚合将不适用于
$near
$geoNear
是否需要?@LiLou
$geoNear
$near
的“聚合”版本。您需要聚合和
$geoNear
返回“距离”比较一下。你没有失去任何东西。如果你当时还不明白的话。它是有效的,谢谢。但我现在有另一个问题,因为我使用的是Spring Data Mongodb框架,它仍然不支持$redact:(@LiLou_u它可能没有“helper”方法,但您始终可以使用DBObject input将自己的pipeline stage实现为一个抽象。关于这一点,在这个网站上有几个答案。我知道,因为我已经写了其中的一些。@LiLou_u添加了Spring Data Mongo的翻译,并在问题上包含了标记。如您所见,添加自定义pipeline stage和语句相当简单le.此聚合将不适用于
$near
$geoNear
是否需要?@LiLou
$geoNear
$near
的“聚合”版本