Le document que vous avez fourni me semble bon, j'ai aussi fait un test simple avec une version courte de votre document et cela fonctionne pour moi.
"_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" } );
Je suggère donc de vérifier d'autres documents de la collection, certains d'entre eux pourraient être malformés pour l'index. Assurez-vous également que les éléments de votre tableau de coordonnées ne sont pas des chaînes. Parce que ce document n'est pas valide pour l'index 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"
]
}
}
]
Veuillez noter les guillemets pour les éléments de coordonnées, ce qui en fait des chaînes.
RÉPONSE AU COMMENTAIRE : Mongo n'autorise qu'un seul index géospatial par collection. Vous n'avez donc pas à spécifier le chemin de champ complet pour votre runCommand. Le nom de la collection est suffisant. Cela devrait fonctionner pour vous si le nom de la collection est checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
J'espère que cela vous aidera !