2012-04-03 35 views
5

Với MongoDB là có cách để thực hiện truy vấn giới hạn (trong một hộp) và sắp xếp kết quả từ điểm trung tâm và yêu cầu chúng trở lại với phép tính khoảng cách ..MongoDB sắp xếp hộp giới hạn địa lý

Tôi nhận ra đang thực hiện gần với một bán kính có thể cung cấp cho tôi một bộ đặt hàng khoảng cách nhưng tôi muốn tôi đang cố gắng để xác định nếu nó có thể trong một hộp không phải là một vòng tròn.

Trả lời

9

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.

+0

Cảm ơn rất nhiều câu trả lời chi tiết và con trỏ đến chủ đề khác. – Nick

1

@nick - Marc không chính xác. Điều đó là có thể. Có vẻ như câu hỏi tương tự được hỏi tại đây: Mongo Bounding Box Query with Limit

Bí quyết là kết hợp cả truy vấn bán kính điểm với hộp giới hạn một. Bạn nhận được tất cả những lợi ích của cả hai (sắp xếp, khoảng cách, hiệu suất).

Các vấn đề liên quan