Tài liệu bạn cung cấp có vẻ tốt đối với tôi, tôi cũng đã thực hiện một bài kiểm tra đơn giản với phiên bản ngắn của tài liệu của bạn và nó phù hợp với tôi.
"_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" } );
Vì vậy, tôi khuyên bạn nên kiểm tra các tài liệu khác trong bộ sưu tập, một số tài liệu trong số đó có thể không đúng định dạng cho chỉ mục. Đồng thời đảm bảo rằng các phần tử mảng tọa độ của bạn không phải là chuỗi. Vì tài liệu này không hợp lệ cho chỉ mục 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"
]
}
}
]
Vui lòng lưu ý dấu ngoặc kép cho các phần tử tọa độ khiến chúng trở thành chuỗi.
TRẢ LỜI CHO NHẬN XÉT: Mongo chỉ cho phép một chỉ mục không gian địa lý cho mỗi bộ sưu tập. Vì vậy, bạn không phải chỉ định toàn bộ đường dẫn trường cho runCommand của mình. Tên bộ sưu tập là đủ. Điều này sẽ phù hợp với bạn nếu tên bộ sưu tập là checkin_20140222
db.runCommand( { geoNear: 'checkin_20140222', near: {type: "Point", coordinates: [73.43, 42.22]}, spherical: true, maxDistance: 40000})
Hy vọng nó sẽ hữu ích!