Dokumentet du tillhandahållit ser bra ut för mig, jag gjorde också ett enkelt test med en kort version av ditt dokument och det fungerar för mig.
"_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" } );
Så jag föreslår att du kontrollerar andra dokument i samlingen, några av dem kan vara felaktiga för indexet. Se också till att dina koordinatmatriselement inte är strängar. Eftersom detta dokument inte är giltigt för 2dsphere index:
"_id" : ObjectId("530cb07c009d8c323b477957"),
"time_from" : ISODate("2014-02-25T15:02:20.714Z"),
"checkin" : [
{
"user_id" : 1,
"loc" : {
"type" : "Point",
"coordinates" : [
"73.43",
"42.22"
]
}
}
]
Observera citattecken för koordinatelementen som gör dem till strängar.
SVAR PÅ KOMMENTAREN: Mongo tillåter endast ett geospatialt index per samling. Så du behöver inte ange hela fältsökvägen för din runCommand. Samlingens namn räcker. Detta bör fungera för dig om samlingens namn är checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
Hoppas det hjälper!