sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb nära/geonear-fråga med variabelt avstånd

Du kommer inte att kunna göra detta med en normal fråga eftersom du inte dynamiskt kan ställa in avståndet per dokument. Från och med MongoDB 2.4 kan du göra detta med aggregeringsramverket eftersom de har lagt till geoNear-operatören i början av pipelines.

Det första steget kommer att vara geoNear som är väldigt likt geonear-kommandot. Vi kommer också att få avståndet från den angivna punkten (10,10) till dokumentet som ett resultat.

Det andra steget kommer att behöva använda projektoperatören för att annonsera skillnaden mellan maximumDistance-fältet och det beräknade geoNear-avståndet.

Slutligen matchar vi de dokument som har ett positivt delta ((max - avstånd)> 0).

Här är pipelinen som använder asynkron Java-drivrutin s hjälparklasser.

package example;

import static com.allanbank.mongodb.builder.AggregationProjectFields.include;
import static com.allanbank.mongodb.builder.QueryBuilder.where;
import static com.allanbank.mongodb.builder.expression.Expressions.field;
import static com.allanbank.mongodb.builder.expression.Expressions.set;
import static com.allanbank.mongodb.builder.expression.Expressions.subtract;

import com.allanbank.mongodb.bson.element.ArrayElement;
import com.allanbank.mongodb.builder.Aggregate;
import com.allanbank.mongodb.builder.AggregationGeoNear;
import com.allanbank.mongodb.builder.GeoJson;

public class AggregateGeoNear {
    public static void main(String[] args) {
        Aggregate aggregate = Aggregate
                .builder()
                .geoNear(
                        AggregationGeoNear.builder()
                                .location(GeoJson.p(10, 10))
                                .distanceField("distance"))
                .project(
                        include("name", "location", "maximumDistance"),
                        set("delta",
                                subtract(field("maximumDistance"),
                                        field("distance"))))
                .match(where("delta").greaterThanOrEqualTo(0)).build();

        System.out
                .println(new ArrayElement("pipeline", aggregate.getPipeline()));
    }
}

Och här är pipelinen skapad:

pipeline : [
  {
    '$geoNear' : {
      near : [
        10, 
        10
      ],
      distanceField : 'distance',
      spherical : false,
      uniqueDocs : true
    }
  }, 
  {
    '$project' : {
      name : 1,
      location : 1,
      maximumDistance : 1,
      delta : {
        '$subtract' : [
          '$maximumDistance', 
          '$distance'
        ]
      }
    }
  }, 
  {
    '$match' : {
      delta : { '$gte' : 0 }
    }
  }
]

HTH - Rob.

P.S. Byggarna ovan använder en förutgåva av 1.2.0-versionen av drivrutinen. Koden går igenom byggmatrisen medan jag skriver och bör släppas senast fredagen den 22 mars 2013.



  1. Implementering av paginering i mongodb

  2. TypeError:sökvägen måste vara en sträng eller buffert MEAN-stack

  3. Undantag använder mongodb som infinispan-cachebutik

  4. Bästa metoder för säkerhetskopiering av databas