2012-04-03 5 views
5

Con MongoDB c'è un modo per eseguire una query limiti (all'interno di una scatola) e ordinare i risultati dal punto centrale e li hanno tornare con il calcolo della distanza ..MongoDB allineati geo riquadro

mi rendo conto di fare un vicino a un raggio posso fornirmi un set ordinato a distanza, ma voglio che cerco di identificare se è possibile all'interno di una scatola e non in un cerchio.

risposta

9

Purtroppo, questo non è possibile esattamente come hai descritto. Come per la sezione "Bounds Query" della documentazione "Geospatial indicizzazione": "Risultati [di $ all'interno di query] non sono in ordine di distanza" http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries

Ci sono alcuni possibili work-around.

1) È possibile eseguire una $ all'interno di query e avere l'applicazione calcolare la distanza di ciascun punto restituita dal centro area.

2) Si potrebbe innanzitutto eseguire un $ all'interno di query, salvare i punti in un array, e quindi eseguire un $ nei pressi di query combinata con un $ in [].

Per esempio,

Immaginate una scatola con i confini [0,0] e [8,8]:

> var box = [ [ 0, 0 ], [ 8, 8 ] ] 

e alcuni punti:

> db.points.find() 
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] } 
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] } 
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] } 
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] } 
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] } 
{ "_id" : 6, "name" : "f", "loc" : [ 9, 4 ] } 

In primo luogo il $ entro query viene eseguita, ed i punti che vengono restituiti vengono salvati:

> var c = db.points.find({loc:{$within:{"$box":box}}}) 
> var boxResults = [] 
> while(c.hasNext()){boxResults.push(c.next().loc)} 

Poi un $ nei pressi di query viene combinato con un $ nella query:

> db.points.find({loc:{$near:[4,4], $in:boxResults}}) 
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] } 
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] } 
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] } 
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] } 
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] } 

La soluzione di cui sopra è stato preso da una domanda simile che è stato chiesto su Google Gruppi: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969

Speriamo che questo ti consenta di eseguire l'operazione che devi fare.

+0

Grazie mille per la risposta dettagliata e il puntatore a quell'altro thread. – Nick

1

@ Nick - Marc non è corretto. È possibile. Sembra una domanda simile posta qui: Mongo Bounding Box Query with Limit

Il segreto è combinare sia una query point-radius che una bounding box. Ottieni tutti i vantaggi di entrambi (ordinamento, distanza, prestazioni).