Geospaziale $ vicino al valore del campo del documento corrente

Accetta questa query:

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

Voglio assegnare a $ maxDistance il valore del campo specificato dal documento valutato corrente. È ansible?

Si è ansible. Devi solo usare $geoNear . Fai attenzione alle catture e leggi attentamente.

Presumendo che il tuo intento è di memorizzare un campo come "travelDistance" per indicare sul documento che tali ricerche devono essere “all’interno” che la distanza fornita dal punto interrogato sia valida. Quindi semplicemente interrogiamo e valutiamo la condizione 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" } }} ]) 

L’unico $geoNear è che $geoNear proprio come $near , restituirà solo un certo numero di documenti “near” in primo luogo. È ansible sintonizzarlo con le opzioni, ma a differenza del modulo di query generale, ciò garantisce sostanzialmente che i risultati restituiti saranno inferiori ai numeri “più vicini” specificati.

Finché ne sei consapevole, allora questo è perfettamente valido.

In effetti, è il modo generale di affrontare la qualificazione di ciò che è “vicino” entro un raggio.

Tieni presente anche la “distanza” in base al modo in cui hai memorizzato le coordinate. Come coppie di coordinate legacy, le distanze saranno espresse in radianti che probabilmente dovrai fare i calcoli per convertire in chilometri o miglia.

Se si utilizza GeoJSON, le distanze vengono sempre considerate in metri, come nel formato standard.

Tutte le note matematiche sono nella documentazione.

NB Leggere attentamente la documentazione $geoNear . Sono richieste opzioni come "spherical" per gli indici "2dsphere" , ad esempio per le coordinate del mondo reale. Potrebbe anche essere necessario applicare un "limit" per aumentare oltre il risultato del documento predefinito di 100, per ulteriori rifiniture.


Come i commenti menzionano la spring mongo, quindi qui fondamentalmente è la stessa cosa fatta per quello:

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