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

kết hợp truy vấn geoNear với một truy vấn khác cho một giá trị

Miễn là máy chủ MongoDB của bạn đủ gần đây, là phiên bản 2.6 trở lên thì chức năng này thực sự đã được chuyển sang công cụ truy vấn chung. Phương thức mongoose ở đây bao bọc .runCommand () biểu mẫu được coi là không dùng nữa đối với tất cả các bản phát hành trong tương lai, vì vậy vấn đề chỉ là đặt một truy vấn chuẩn với các toán tử bổ sung.

GeoLocation.find({
    "$nearSphere": {
        "$geometry": {
            "type": "Point",
            "coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)] 
        },
        "$maxDistance": distanceInMeters
    },
    "loc.type": "Point"
},function(err,docs) {

   // The documents are also mongoose document objects as well
});

Xem các tùy chọn khác trên $ nearSphere hoặc các nhà khai thác khác cho các tùy chọn. Sự khác biệt chính ở đây là $ maxDistance được tính bằng mét khi biểu mẫu GeoJSON được sử dụng, chứ không phải là radian nếu ngược lại.

Tất nhiên cũng có $ geoNear nhà điều hành cho đường ống tổng hợp. Tính năng này có sẵn kể từ MongoDB 2.4 và có thể sử dụng các tùy chọn khác như "truy vấn" để thu hẹp kết quả hơn nữa. Ưu điểm có thể có khác ở đây là nó sẽ "chiếu" một trường vào kết quả của bạn thể hiện "khoảng cách" từ điểm truy vấn. Điều này có thể được sử dụng trong các tính toán khác hoặc sắp xếp tùy chỉnh:

GeoLocation.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
            },
            "distanceField": "distance",
            "maxDistance": distanceInMeters,
            "spherical": true,
            "query": { "loc.type": "Point" }
        }},
        { "$sort": { "distance": -1 } } // Sort nearest first
    ],
    function(err,docs) {

       // These are not mongoose documents, but you can always cast them
    }
);

Sự khác biệt khác cần lưu ý là trong biểu mẫu truy vấn tiêu chuẩn, kết quả không còn giới hạn trong 100 tài liệu như chúng ở dạng "lệnh". Tổng hợp $ geoNear giới hạn cho 100 tài liệu theo mặc định, nhưng số lượng tài liệu trả về có thể được điều chỉnh bằng tùy chọn "giới hạn" bổ sung cho lệnh đường ống. Câu lệnh tổng hợp không "sắp xếp" các kết quả khác với các tài liệu tối đa để trả về từ tìm kiếm là kết quả hàng đầu với các điều kiện, nhưng chúng không được trả về theo thứ tự, vì vậy bạn cần phải sắp xếp chúng như được hiển thị.

Trong cả hai trường hợp, bạn nên di chuyển mã của mình để sử dụng một trong hai biểu mẫu này vì biểu mẫu lệnh được coi là không dùng nữa và sẽ bị xóa trong tương lai. Liệu API mongoose có giữ lại phương thức của nó như một "trình bao bọc" cho một trong các biểu mẫu này hay không, nhưng hầu như không thể xảy ra, vì vậy tốt hơn là bạn nên gắn bó với các biểu mẫu được hỗ trợ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để tự động loại bỏ các truy vấn MongoDB chậm?

  2. Thiết kế lược đồ MongoDB - Bỏ phiếu cho bài đăng

  3. Tham chiếu Mongoengine xảy ra sau khi sử dụng select_osystem ()

  4. cập nhật mongodb nếu một trường không tồn tại

  5. Nhận các giá trị riêng biệt của nhiều giá trị trong Mongodb