Thật không may, điều này là không thể chính xác như bạn mô tả. Theo "Bounds Queries" của "Indexing không gian địa lý" tài liệu: "Kết quả [của $ trong truy vấn] không được sắp xếp theo khoảng cách" http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-BoundsQueries
Có một vài quyết có thể có.
1) Bạn có thể thực hiện $ trong truy vấn và yêu cầu ứng dụng tính toán khoảng cách của mỗi điểm được trả về từ giữa hộp.
2) Trước tiên bạn có thể thực hiện truy vấn $ trong truy vấn, lưu các điểm trong một mảng và sau đó chạy truy vấn $ gần kết hợp với $ in [].
Ví dụ,
Hãy tưởng tượng một hộp có ranh giới [0,0] và [8,8]:
> var box = [ [ 0, 0 ], [ 8, 8 ] ]
và một số điểm:
> db.points.find()
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
{ "_id" : 6, "name" : "f", "loc" : [ 9, 4 ] }
Đầu tiên là $ trong vòng truy vấn được thực hiện và các điểm được trả về sẽ được lưu:
> var c = db.points.find({loc:{$within:{"$box":box}}})
> var boxResults = []
> while(c.hasNext()){boxResults.push(c.next().loc)}
Sau đó, một $ gần truy vấn được kết hợp với một $ trong truy vấn:
> db.points.find({loc:{$near:[4,4], $in:boxResults}})
{ "_id" : 1, "name" : "a", "loc" : [ 5, 4 ] }
{ "_id" : 2, "name" : "b", "loc" : [ 4, 2 ] }
{ "_id" : 3, "name" : "c", "loc" : [ 1, 4 ] }
{ "_id" : 4, "name" : "d", "loc" : [ 2, 7 ] }
{ "_id" : 5, "name" : "e", "loc" : [ 7, 7 ] }
Các giải pháp trên được lấy từ một câu hỏi tương tự đã được hỏi về Google Groups: groups.google.com/group/mongodb-user/browse_thread/thread/22d1f0995a628c84/1f2330694a7cf969
Hy vọng điều này sẽ cho phép bạn thực hiện thao tác mà bạn cần thực hiện.
Cảm ơn rất nhiều câu trả lời chi tiết và con trỏ đến chủ đề khác. – Nick