sql >> Database teknologi >  >> NoSQL >> MongoDB

Geospatial $nær inden for den aktuelle dokumentfeltværdi

Ja det er muligt. Du bruger bare $geoNear i stedet. Pas på fangsterne og læs omhyggeligt.

Forudsat at din hensigt er at gemme et felt såsom "travelDistance" at angive på dokumentet, at sådanne søgninger skal være "inden for" den angivne afstand fra det forespurgte punkt for at være gyldige. Så forespørger og evaluerer vi simpelthen betingelsen med $redact :

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

Den eneste fangst er, at $geoNear ligesom $near vil kun returnere et vist antal dokumenter "nær" i første omgang. Du kan justere det med mulighederne, men i modsætning til den generelle forespørgselsformular er dette grundlæggende en garanti for, at de endelige returnerede resultater vil være mindre end de angivne "nærmeste" tal.

Så længe du er klar over det, så er dette helt gyldigt.

Det er faktisk den generelle måde at håndtere at kvalificere det, der er "nær" inden for en radius.

Vær også opmærksom på "afstanden" efter hvordan du har gemt koordinaterne. Som ældre koordinatpar vil afstandene være i radianer, som du sandsynligvis bliver nødt til at regne ud for at konvertere til kilometer eller miles.

Hvis du bruger GeoJSON, betragtes afstandene altid i meter, som standardformatet.

Alle de matematiske noter er i dokumentationen.

NB Læs $geoNear dokumentation omhyggeligt. Indstillinger som "spherical" er påkrævet for "2dsphere" indekser, som du burde have for den virkelige verdens koordinater. Også "limit" skal muligvis anvendes for at øge ud over standardresultatet på 100 dokumenter for yderligere trimning.

Som kommentarerne nævner spring mongo, så er her stort set det samme gjort for det:

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



  1. Redis - Udløbne indekser slettes ikke

  2. MongoDB $isoWeek

  3. mongoexport JSON-parsingsfejl

  4. Hvordan eksporterer jeg alle samlinger i MongoDB?