MongoDB hat Unterstützung für Geoindexing eingebaut. Sie müssen die Berechnung nicht selbst durchführen.
Grundsätzlich würden Sie ein Feld erstellen, in dem lat / long als Array oder als Unterdokument gespeichert ist, etwa eines der folgenden:
{ loc : [ 50 , 30 ] } //SUGGESTED OPTION
{ loc : { x : 50 , y : 30 } }
{ loc : { lon : 40.739037, lat: 73.992964 } }
Indizieren Sie dann das neue Loc-Feld entsprechend:
db.places.ensureIndex( { loc : "2d" } )
Schließlich können Sie einen der Operatoren verwenden, um einen Punkt nach den nächsten 20 Ergebnissen abzufragen:
db.places.find( { loc : { $near : [50,50] } } ).limit(20)
Sie könnten natürlich einfach MongoDB verwenden, um die Daten zu speichern, dann die Informationen mit find () aus der Datenbank abrufen und die Berechnung clientseitig durchführen, aber ich stelle mir vor, dass Sie dies nicht tun möchten.
Wenn der Abstandsteil der Gleichung Ihren Wünschen entspricht:
http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand
Der Operator $ geoNear gibt auch die Entfernung zurück. Ein Beispiel:
> db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
{
"ns" : "test.places",
"near" : "1100110000001111110000001111110000001111110000001111",
"results" : [
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b93b83c574d8760280"),
"y" : [
1,
1
],
"category" : "Coffee"
}
},
{
"dis" : 69.29646421910687,
"obj" : {
"_id" : ObjectId("4b8bd6b03b83c574d876027f"),
"y" : [
1,
1
]
}
}
],
"stats" : {
"time" : 0,
"btreelocs" : 1,
"btreelocs" : 1,
"nscanned" : 2,
"nscanned" : 2,
"objectsLoaded" : 2,
"objectsLoaded" : 2,
"avgDistance" : 69.29646421910687
},
"ok" : 1
}
Die "dis" : 69.29646421910687
Elemente sind genau das, wonach Sie suchen. Es gibt auch eine Option für den sphärischen Abstand.
Weitere Informationen zu Geoindexen und deren Verwendung finden Sie hier.
http://www.mongodb.org/display/DOCS/Geospatial+Indexing/