MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zapytanie MongoDb near/geonear ze zmienną odległością

Nie będziesz w stanie tego zrobić za pomocą normalnego zapytania, ponieważ nie możesz dynamicznie ustawić odległości na dokument. Od MongoDB 2.4 możesz to zrobić za pomocą struktury agregacji, ponieważ dodali operator geoNear do początków potoków.

Pierwszym etapem będzie polecenie geoNear, które jest bardzo podobne do polecenia geonear. W rezultacie otrzymamy również odległość od określonego punktu (10,10) do dokumentu.

W drugim etapie będziemy musieli użyć operatora projektu, aby dodać różnicę między polem maximumDistance a obliczoną odległością geoNear.

Na koniec dopasowujemy te dokumenty, które mają dodatnią deltę ((maks. - odległość)> 0).

Oto potok wykorzystujący asynchroniczny sterownik Java klasy pomocnicze.

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

A oto tworzony jest potok:

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.

PS Konstruktorzy powyżej używają wersji wstępnej sterownika w wersji 1.2.0. Kod przechodzi przez macierz kompilacji podczas pisania i powinien zostać wydany do piątku, 22 marca 2013 r.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB C# Driver i wygenerowane przez serwer identyfikatory ObjectId

  2. Indeks Mongodb 2dsphere dla zagnieżdżonego pola tablicy

  3. Mongodb agreguje trzy kolekcje

  4. Przechowywanie schematów formularzy i funkcji w bazie danych

  5. Jak uzyskać tablicę obiektów json zamiast dokumentów mongoose?