Das von Ihnen bereitgestellte Dokument sieht für mich gut aus. Ich habe auch einen einfachen Test mit einer Kurzversion Ihres Dokuments durchgeführt und es funktioniert für mich.
"_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" } );
Daher schlage ich vor, andere Dokumente in der Sammlung zu überprüfen, einige von ihnen könnten für den Index fehlerhaft formatiert sein. Stellen Sie außerdem sicher, dass Ihre Koordinaten-Array-Elemente keine Zeichenfolgen sind. Da dieses Dokument für den 2dsphere-Index nicht gültig ist:
"_id" : ObjectId("530cb07c009d8c323b477957"),
"time_from" : ISODate("2014-02-25T15:02:20.714Z"),
"checkin" : [
{
"user_id" : 1,
"loc" : {
"type" : "Point",
"coordinates" : [
"73.43",
"42.22"
]
}
}
]
Bitte beachten Sie die Anführungszeichen für die Koordinatenelemente, die sie zu Zeichenfolgen machen.
ANTWORT AUF DEN KOMMENTAR: Mongo erlaubt nur einen Geodatenindex pro Sammlung. Sie müssen also nicht den gesamten Feldpfad für Ihren runCommand angeben. Sammlungsname ist genug. Dies sollte für Sie funktionieren, wenn der Sammlungsname checkin_20140222
ist
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
Hoffe es hilft!