sql >> Database >  >> NoSQL >> MongoDB

Geospatial $bijna binnen huidige documentveldwaarde

Ja het is mogelijk. Je gebruikt gewoon $geoNear in plaats van. Pas op voor de vangsten en lees aandachtig.

Ervan uitgaande dat het uw bedoeling is om een ​​veld op te slaan zoals "travelDistance" om op het document aan te geven dat dergelijke zoekopdrachten "binnen" de opgegeven afstand van het opgevraagde punt moeten zijn om geldig te zijn. Vervolgens vragen en evalueren we de voorwaarde met $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"
    }
  }}
])

De enige vangst is dat $geoNear net als $near zal in de eerste plaats slechts een bepaald aantal documenten "in de buurt" retourneren. U kunt dat afstemmen met de opties, maar in tegenstelling tot het algemene vraagformulier, garandeert dit in feite dat de uiteindelijke geretourneerde resultaten minder zullen zijn dan de opgegeven "dichtstbijzijnde" getallen.

Zolang je je daarvan bewust bent, is dit volkomen terecht.

Het is in feite de algemene manier om met kwalificatie om te gaan wat "dichtbij" binnen een straal is.

Houd ook rekening met de "afstand" op basis van hoe u de coördinaten hebt opgeslagen. Als oude coördinatenparen zijn de afstanden in radialen, wat u waarschijnlijk moet uitrekenen om te converteren naar kilometers of mijlen.

Als u GeoJSON gebruikt, worden de afstanden altijd in meters beschouwd, als het standaardformaat.

Alle rekennotities staan ​​in de documentatie.

NB Lees de $geoNear documentatie zorgvuldig. Opties zoals "spherical" zijn vereist voor "2dsphere" indexen, zoals u zou moeten hebben voor coördinaten in de echte wereld. Ook "limit" moet mogelijk worden toegepast om verder te gaan dan het standaard resultaat van 100 documenten, voor verder bijsnijden.

Zoals de commentaren vermelden spring mongo, dan wordt hier eigenlijk hetzelfde voor gedaan:

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. Een set leegmaken/verwijderen in Redis?

  2. Retourneer alleen overeenkomende subdocumentelementen binnen een geneste array

  3. Spring Redis-fouthandvat

  4. MapVerminder schuifelen en sorteren in Hadoop