2014-04-20 4 views
24

Sto solo cercando di ottenere una semplice query near funzionante. Ecco un esempio del mio documento.

{"point": 
    {"type": "Point", 
    "coordinates": [30.443902444762696, -84.27326978424058]}, 
    "created_on": {"$date": 1398016710168}, 
    "radius": 180, 
    "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
    "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
    "expires_on": {"$date": 1399831110168} 
} 

e con mongod ho provato il comando:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}}); 

ma ottengo questo errore:

error: { "$err" : "Unable to execute query: error processing query: ns=foo.bar skip=0\nTree: GEONEAR field=point maxdist=1.79769e+308 isNearSphere=0 || First: notFirst: full path: point\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query", "code" : 17007 }

Forse il mio google fu non è così netta oggi, ma non riuscivo a trovare nulla. Inoltre, ho eseguito il comando indice di sicurezza. La mia intenzione è che queste siano le posizioni delle mappe.

db.bar.ensureIndex({a:1}); 
db.bar.ensureIndex({geo:"2d"}); 

risposta

45

Pochi problemi, si creano gli indici sulla raccolta foo del database foo, ma sta interrogando la collezione barra di. Devi essere nella raccolta corretta.

Leggendo il documento inserito è necessario aggiungere un indice "2dsphere" a support the geoJson objects. Questo indice deve essere sull'elemento "punto" dei documenti, in modo da provare

db.bar.createIndex({point:"2dsphere"}); 

È quindi possibile eseguire una query come segue fornendo un GeoJSON obj per la query:

db.bar.find(
    { point : 
     { $near : 
      { 
      $geometry : { 
       type : "Point" , 
       coordinates : [-84.27326978424058, 30.443902444762696] }, 
      $maxDistance : 1 
      } 
     } 
    } 
) 
+3

Ottimo, risolto il problema utilizzando: 'db. .ensureIndex ({point: "2dsphere"}); ' – AfromanJ

+0

Grazie amico, funziona come un fascino .. –

+1

Si noti che sine' 3.0.0' 'ensureIndex' [è stato deprecato] (https: //docs.mongodb. com/manual/reference/method/db.collection.ensureIndex /) ed è un alias per 'createIndex' (risposta modificata di conseguenza) –

3

Così sembra che ci essere un paio di cose sbagliate:

  • Dai dati che vengono visualizzati e anche le informazioni di query le informazioni pertinenti sono contenute sotto il punto di campo e in formato GeoJSON. La vostra creazione dell'indice:
 
db.foo.createIndex({geo: "2d"}) 

non "fallire", perché c'è attualmente non è un campo chiamato "geo" e il campo con i dati avrebbe dovuto essere in quel posto. Se invece avessi usato "point", che è il campo corretto, allora avresti ricevuto un errore che ti diceva che questo tipo di indice non è valido per i dati di GeoJSON. Avete bisogno di un indice "2dsphere":

db.points.createIndex({ "point": "2dsphere" }) 
  • Estendendo lo stesso problema, ancora una volta i dati sono in formato GeoJSON e la forma della query è che per un lascito coppia di coordinate. È necessario modificare gli argomenti query in modo che non fallisce:
 
db.points.find({point: { 
    $near: { 
     $geometry:{ 
      type: "Point", 
      coordinates: [-84.26060492426588, 30.45023887165371] 
     } 
    } 
}}) 

vedere la documentazione per $near

5
db.prod.createIndex({ "location": "2d" }) 

Questa risolto per lo stesso problema per me.

Dove prod è il mio nome della raccolta e la posizione è nome della colonna che memorizza geo localizzazione (GeoPoint)

Alcuni discussione sullo stesso può essere trovato here

+1

grazie mille. Questo ha funzionato per me! :) –

1

Oltre alle risposte di cui sopra, se si' Ho già provato a creare un indice e ho ottenuto qualche sintassi o campo errato, puoi eseguire

db.<yourcollection>.dropIndexes(); Per pulire tutti gli indici e ricrearli correttamente.

Inoltre, l'indice dovrebbe essere creato il genitore di "coordinate", non su se stessa coordinate:

{ 
    "_id": 59ac03d168eaaa14c2a57a00", 
    "location":{ 
     "type":"Point", 
     "coordinates":[ 
     131.6667, 
     57.8368 
     ] 
    }, 
    "age":53, 
    "username":"Brandi_Greenfelder" 
} 

db.<yourcollection>.createIndex({ location: '2dsphere' });

Attenzione, c'è "2d" e "2dsphere", utilizzare la secondo come è la cosa nuova.