$ Geoespacial cerca del valor del campo del documento actual

Toma esta consulta:

{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } } 

Quiero asignar $ maxDistance al valor del campo especificado del documento evaluado actual. ¿Es eso posible?

Si es posible. Usted simplemente usa $geoNear en $geoNear lugar. Tenga cuidado con las capturas y lea con cuidado.

Suponiendo que su intención es almacenar un campo como "travelDistance" para indicar en el documento que cualquier búsqueda debe estar “dentro” de la distancia suministrada desde el punto consultado para ser válida. Luego simplemente consultamos y evaluamos la condición con $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" } }} ]) 

La única pega es que $geoNear justo como $near solo devolverá una cierta cantidad de documentos “cercanos” en primer lugar. Puede sintonizar eso con las opciones, pero a diferencia del formulario de consulta general, esto básicamente garantiza que los resultados eventualmente devueltos serán menores que los números “más cercanos” especificados.

Mientras lo sepas, entonces esto es perfectamente válido.

De hecho, es la forma general de tratar de calificar lo que está “cerca” dentro de un radio.

También tenga en cuenta la “distancia” de acuerdo con la forma en que tiene almacenadas las coordenadas. Como pares de coordenadas heredados, las distancias serán en radianes, lo que probablemente necesite hacer para convertir a kilómetros o millas.

Si usa GeoJSON, las distancias siempre se consideran en metros, como el formato estándar.

Todas las notas de matemáticas están en la documentación.

NB Lea $geoNear documentación de $geoNear . Se requieren opciones como "spherical" para los índices "2dsphere" , como debería tener para las coordenadas del mundo real. También es posible que deba aplicarse "limit" para boost el resultado del documento predeterminado 100, para un recorte posterior.


Como los comentarios mencionan a Spring Mongo, aquí básicamente se hace lo mismo:

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