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

MongoDb nær/geonear-forespørgsel med variabel afstand

Du vil ikke være i stand til at gøre dette med en normal forespørgsel, da du ikke dynamisk kan indstille afstanden pr. dokument. Fra MongoDB 2.4 kan du gøre dette med aggregeringsrammerne, da de har tilføjet geoNear-operatøren til starten af ​​pipelines.

Den første fase vil være geoNear, som minder meget om geonear-kommandoen. Vi vil også få afstanden fra det angivne punkt (10,10) til dokumentet som et resultat.

Den anden fase bliver vi nødt til at bruge projektoperatøren til at adskille forskellen mellem maximumDistance-feltet og den beregnede geoNear-afstand.

Til sidst matcher vi de dokumenter, der har et positivt delta ((max - afstand)> 0).

Her er pipelinen ved hjælp af asynkron Java-driver 's hjælperklasser.

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

Og her er pipelinen oprettet:

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. Builderne ovenfor bruger en forhåndsudgivelse af 1.2.0-versionen af ​​driveren. Koden gennemgår byggematrixen, mens jeg skriver og skulle være frigivet fredag ​​den 22. marts 2013.



  1. MongoDB:Ufølsom mellem store og små bogstaver og accentufølsom

  2. Tilføj data i dokumenter i Mongo DB ved hjælp af PHP

  3. Hvordan migrerer man data fra MongoDB til SQL-Server?

  4. Mongo DB kunne ikke startes