MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDb близо/geonear заявка с променливо разстояние

Няма да можете да направите това с нормална заявка, тъй като не можете динамично да задавате разстоянието за документ. От MongoDB 2.4 можете да направите това с рамката за агрегиране, тъй като те са добавили оператора geoNear към началото на тръбопроводите.

Първият етап ще бъде geoNear, който е много подобен на командата geonear. Като резултат ще получим и разстоянието от посочената точка (10,10) до документа.

На втория етап ще трябва да използваме оператора на проекта, за да рекламираме разликата между полето за максимално разстояние и изчисленото geoNear разстояние.

И накрая, съпоставяме онези документи, които имат положителна делта ((максимално разстояние)> 0).

Ето тръбопровода, използващ Асинхронен Java драйвер помощни класове на.

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

И ето тръбопроводът е създаден:

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 - Роб.

P.S. Конструкторите по-горе използват предварителна версия на 1.2.0 версия на драйвера. Кодът преминава през матрицата за изграждане, докато пиша, и трябва да бъде пуснат до петък, 22 март 2013 г.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да проверите дали избраните имейл и име вече съществуват в MongoDB

  2. Създаване на времева линия, подобна на Twitter, с MongoDB

  3. MongoDB find()

  4. Ограничете вмъкванията в mongodb

  5. Как да напиша Mongo заявка за намиране на поддокумент с условие