복붙노트

[MONGODB] 현재 문서 필드 값 내 근처 지리 $

MONGODB

현재 문서 필드 값 내 근처 지리 $

이 쿼리를 가지고 :

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

나는 $ maxDistance에게 현재 평가 문서에서 지정된 필드의 값을 할당 할. 그게 가능합니까?

해결법

  1. ==============================

    1.네, 그것은 가능합니다. 당신은 대신에 $ geoNear를 사용합니다. 어획량을 조심하고주의 깊게 읽어 보시기 바랍니다.

    네, 그것은 가능합니다. 당신은 대신에 $ geoNear를 사용합니다. 어획량을 조심하고주의 깊게 읽어 보시기 바랍니다.

    당신의 의도는 그러한 검색이 "내"해야한다는 문서에 표시하기 위해 "travelDistance"로 필드를 저장하는 것을 가정하면 조회 된 시점으로부터 공급 된 거리가 유효합니다. 그런 다음 우리는 단순히 쿼리 $ 편집하다와 조건을 평가 :

    db.collection.aggregate([
      { "$geoNear": {
        "near": { 
          "type": "Point",
          "coordinates": [x,y]
        },
        "spherical": true,
        "distanceField": "distance"
      }},
      { "$redact": {
        "$cond": {
          "if": { "$lte": [ "$distance", "$travelDistance" ] },
          "then": "$$KEEP",
          "else": "$$PRUNE"
        }
      }}
    ])
    

    유일한 캐치는 $ geoNear 단지 $처럼 가까운 첫 번째 장소에 "가까이"문서의 특정 번호를 반환 할 것입니다. 당신은 옵션이 있지만, 일반 쿼리 형태와는 달리, 이것은 기본적으로 최종 반환 된 결과가 덜 지정된 "가장 가까운"숫자보다 것이다 튜닝 보장되는 수.

    언제 까지나 당신이 알고있는대로,이 완벽하게 유효합니다.

    그것은 사실 반경 내에서 "가까운"어떤 자격을 처리하는 일반적인 방법입니다.

    또한 저장 좌표를이 방법에 따라 "거리"의주의하십시오. 유산은 좌표 쌍으로 거리 당신은 아마 킬로미터 나 마일리지로 변환하는 계산을 수행해야합니다 라디안에있을 것입니다.

    GeoJSON를 사용하는 경우, 다음의 거리가 항상 표준 형식으로, 미터로 간주됩니다.

    모든 수학 노트는 문서에 있습니다.

    코멘트 봄 몽고를 언급으로, 여기에 그것에 대해 다 같은 것은 기본적으로 :

    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"
                 )
              )
           );
         }
        }
    );
    
  2. from https://stackoverflow.com/questions/44694847/geospatial-near-within-current-document-field-value by cc-by-sa and MIT license