2014-04-05 9 views
5

Sto cercando di utilizzare alcune funzionalità di geolocalizzazione in mongodb. L'utilizzo di una query di ricerca con $ near non sembra funzionare!

Al momento ho questo oggetto nel mio database:

{ 
    "Username": "Deano", 
    "_id": { 
     "$oid": "533f0b722ad3a8d39b6213c3" 
    }, 
    "location": { 
     "type": "Point", 
     "coordinates": [ 
      51.50998, 
      -0.1337 
     ] 
    } 
} 

Ho il seguente indice impostato così:

{ 
    "v": 1, 
    "key": { 
    "location": "2dsphere" 
    }, 
    "ns": "heroku_app23672911.catchmerequests", 
    "name": "location_2dsphere", 
    "background": true 
} 

Quando faccio funzionare questa domanda:

db.collectionname.find({ "location" : { $near : [50.0 , -0.1330] , $maxDistance : 10000 }}) 

Ho ricevuto questo errore:

error: { 
    "$err" : "can't parse query (2dsphere): { $near: [ 50.0, -0.133 ], $maxDistance: 10000.0 }", 
    "code" : 16535 
} 

Qualcuno sa dove sto andando male? Qualsiasi aiuto sarebbe molto apprezzato!

risposta

11

Sembra che sia necessario utilizzare il formato GeoJSON se anche i dati sono in formato GeoJSON, come è il tuo. Se si utilizza:

db.collectionname.find({ 
    "location": { 
     $near: { 
      $geometry: 
       { type: "Point", coordinates: [50.0, -0.1330] }, $maxDistance: 500 
     } 
    } 
}) 

dovrebbe funzionare. Potrei replicare il tuo errore utilizzando il formato di archiviazione GeoJSON per il campo, ma ciò che i documenti chiamano i punti legacy nell'espressione della query. Credo che i documenti sono un po 'poco chiaro, nel senso che suggeriscono è possibile utilizzare sia GeoJSON e l'eredità coordina con un indice di 2dsphere 2dsphere

Sto usando 2.4.10, per quello che vale, come ci sono stati alcuni grandi cambiamenti al territorio nella versione 2.4.

+0

Ehi, in realtà sto cercando di cercare la prima posizione più vicina, indipendentemente da maxDistance. Funziona ma ci vogliono 4 secondi, è molto lento. C'è un modo per aumentare le prestazioni? – John

+0

@ John. Non so dalle informazioni che hai fornito, ma uscire da maxDistance significa cercare l'intero db, che a seconda delle dimensioni potrebbe richiedere molto tempo. –

+0

'$ nearSphere' restituisce dal più vicino al più lontano a destra? Quindi sto usando limit(). La mia posizione nel mio database è la seguente: '[-5.95001220703125,46.149993896484375]' così quando invio '[-5, -46]' questo richiederà 2 - 3 secondi. Ma se invio questa posizione, E.g '[-5.953801, 46.001843]' questo è veramente veloce. Ottengo il risultato solo in '22ms'. Quindi è normale? – John

1

Questa non è esattamente una soluzione in quanto non ho mai funzionato in precedenza, ma usando geoNear sono riuscito a ottenere ciò che volevo.

db.runCommand({ geoNear : 'catchmerequests', near: 
{ type: 'Point', coordinates : [50, 50] }, spherical : true }); 

Se qualcuno può scoprire perché il $ originale nei pressi tentativo fallito che sarebbe ancora essere apprezzato, ma sto postando questo per chiunque altro che altro che è alla ricerca di un'alternativa di lavoro.

+0

Ho pubblicato quello che penso sia una soluzione. Ho avuto intenzione di suonare per un po 'con il mongo spaziale - Sono un ragazzo Postgis - e mi sono divertito. Grazie. –

+0

@Dealss Ho notato che la risposta di cui sopra è stata contrassegnata come la soluzione, ma vedo qui che non ha funzionato per te e stai utilizzando la soluzione geoNear. Ho visto il riferimento qui sotto nei documenti MongoDB e mi chiedevo se avessi fatto la stessa cosa di me e "inserito" il tuo documento. _Per gli inserti, MongoDB inserisce il documento ma non aggiunge all'indice 2dsphere. Anche la soluzione originale ha funzionato con $ near? http://docs.mongodb.org/manual/core/2dsphere/ – Ravenous

Problemi correlati