Dokument, który dostarczyłeś, wygląda dobrze dla mnie, wykonałem też prosty test z krótką wersją twojego dokumentu i działa dla mnie.
"_id" : ObjectId("530cb07c009d8c323b477957"),
"time_from" : ISODate("2014-02-25T15:02:20.714Z"),
"checkin" : [
{
"user_id" : 1,
"loc" : {
"type" : "Point",
"coordinates" : [
73.43,
42.22
]
}
}
]
db.testGeo.ensureIndex( { "checkin.loc" : "2dsphere" } );
Sugeruję więc sprawdzenie innych dokumentów w kolekcji, niektóre z nich mogą być zniekształcone pod kątem indeksu. Upewnij się również, że elementy tablicy współrzędnych nie są łańcuchami. Ponieważ ten dokument nie dotyczy indeksu 2dsphere:
"_id" : ObjectId("530cb07c009d8c323b477957"),
"time_from" : ISODate("2014-02-25T15:02:20.714Z"),
"checkin" : [
{
"user_id" : 1,
"loc" : {
"type" : "Point",
"coordinates" : [
"73.43",
"42.22"
]
}
}
]
Zwróć uwagę na znaki cudzysłowu dla elementów współrzędnych, co czyni je ciągami.
ODPOWIEDŹ NA KOMENTARZ: Mongo dopuszcza tylko jeden indeks geoprzestrzenny na kolekcję. Nie musisz więc określać całej ścieżki pola dla swojego runCommand. Wystarczy nazwa kolekcji. Powinno to zadziałać, jeśli nazwa kolekcji to checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
Mam nadzieję, że to pomoże!