MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB Địa cầu truy vấn địa lý chồng chéo một điểm

Chà, sẽ đẹp hơn nếu bạn có thể sử dụng một đối tượng GeoJSON để đại diện cho vị trí nhưng hiện tại thì các loại được hỗ trợ thực sự bị hạn chế vì vậy loại "Vòng kết nối" lý tưởng sẽ không được hỗ trợ.

Gần nhất bạn có thể làm là một "Đa giác" xấp xỉ một vòng tròn, nhưng đây có lẽ là một công việc hơi quá nhiều để tạo chỉ cho mục đích truy vấn này. Cách khác có cách làm này và sau đó áp dụng $geoIntersects là kết quả sẽ không được "sắp xếp" theo khoảng cách từ điểm truy vấn. Điều đó dường như ngược lại với mục đích của việc tìm kiếm "chiếc bánh pizza gần nhất" với điểm xuất xứ.

May mắn thay, có một $geoNear hoạt động được thêm vào khung tổng hợp kể từ MongoDB 2.4 trở lên. Điều tốt ở đây là nó cho phép "chiếu" trường khoảng cách trong kết quả. Sau đó, điều này cho phép bạn thực hiện lọc logic trên máy chủ đối với những điểm bị ràng buộc "trong bán kính" đối với khoảng cách từ điểm gốc. Nó cũng cho phép sắp xếp trên máy chủ.

Nhưng bạn vẫn cần thay đổi lược đồ của mình để hỗ trợ chỉ mục

db.places.insert({
    "name": "Pizza Hut",
    "location": { 
        "type": "Point",
        "coordinates": [
            151.00211262702942,
            -33.81696995135973
        ]
    },
    "radius": 20
})

db.places.ensureIndex({ "location": "2dsphere" })

Và đối với truy vấn tổng hợp:

db.places.aggregate([

    // Query and project distance
    { "$geoNear": {
        "near": { 
            "type": "Point",
            "coordinates": [ 
                150.92094898223877,
                -33.77654333272719
            ]
        },
        "distanceField": "distance",
        "distanceMultiplier": 0.001,
        "maxDistance": 100000,
        "spherical": true
    }},

    // Calculate if distance is within delivery sphere
    { "$project": {
         "name": 1,
         "location": 1,
         "radius": 1,
         "distance": 1,
         "within": { "$gt": [ "$radius", "$distance" ] }
    }},

    // Filter any false results
    { "$match": { "within": true } },

    // Sort by shortest distance from origin
    { "$sort": { "distance": -1 } }
])

Về cơ bản, điều này nói rằng,

Có các tùy chọn khác mà bạn có thể chuyển đến $geoNear để tinh chỉnh kết quả, cũng như trả về hơn 100 kết quả mặc định nếu được yêu cầu và về cơ bản chuyển các tùy chọn khác để truy vấn, chẳng hạn như "loại" hoặc "tên" hoặc bất kỳ thông tin nào khác mà bạn có trên tài liệu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để chuyển truy vấn MongoDB thành JSON?

  2. Chuyển đổi hình ảnh base64 thành tệp trong Node Js

  3. Làm thế nào để đổi tên tên trường trong Spring-mongodb khi chèn dữ liệu?

  4. MongoDB kéo phần tử mảng từ một bộ sưu tập

  5. Sử dụng PouchDB với MongoDB