あなたが提供したドキュメントは私には良さそうです。私はあなたのドキュメントの短いバージョンで簡単なテストも行いました、そしてそれは私のために働きます。
"_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" } );
したがって、コレクション内の他のドキュメントを確認することをお勧めします。それらの一部は、インデックスの形式が正しくない可能性があります。また、座標配列要素が文字列でないことを確認してください。このドキュメントは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"
]
}
}
]
座標要素を文字列にするための引用符に注意してください。
コメントへの回答: Mongoでは、コレクションごとに1つの地理空間インデックスのみが許可されます。したがって、runCommandのフィールドパス全体を指定する必要はありません。コレクション名で十分です。これは、コレクション名がcheckin_20140222
の場合に機能するはずです。
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
お役に立てば幸いです。