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

Các vị trí truy vấn trong bán kính trong MongoDB

Đó là quy trình 3 bước.

  • Bước 1) Nhúng Điểm GeoJSON vào tài liệu của bạn.
  • Bước 2) Lập chỉ mục đường dẫn đến các điểm, sử dụng 2dsphere .
  • Bước 3) Truy vấn các điểm trong tài liệu bằng cách sử dụng $geoWithin$centerSphere .

Để thực hiện truy vấn không gian địa lý, bạn cần thay đổi cấu trúc tài liệu để phù hợp với GeoJSON Point.Which trông giống như thế này.

loc : {
    type : "Point",
    coordinates : [lng, lat]
}

Mã mẫu để dịch bộ sưu tập của bạn sang định dạng Điểm.

// sample setup code.
// use test; 
// db.positions.drop();
// db.positions.insert({
    // pos : {
        // lat : 0,
        // lon : 30
    // }
// });
db.positions.find().forEach(function (doc) {
    var point = {
        _id : doc._id,
        loc : {
            type : "Point",
            coordinates : [doc.pos.lon, doc.pos.lat]
        }
    };
    db.positions.update(doc, point);
});
db.positions.find().pretty();

Sau đó, bạn có thể sử dụng $geoWithin$near trong các truy vấn của bạn như ví dụ bên dưới.

Ví dụ

Thiết lập

var createLandmarkDoc = function (name, lng, lat) {
    return {
        name : name,
        loc : {
            type : "Point",
            coordinates : [lng, lat]
        }
    };
};
var addNewLandmark = function(name, lng, lat){
    db.landmarks.insert(createLandmarkDoc(name, lng, lat));
};

db.landmarks.drop();
// Step 1: Add points.
addNewLandmark("Washington DC", 38.8993487, -77.0145665);
addNewLandmark("White House", 38.9024593, -77.0388266);
addNewLandmark("Library of Congress", 38.888684, -77.0047189);
addNewLandmark("Patuxent Research Refuge", 39.0391718, -76.8216182);
addNewLandmark("The Pentagon", 38.871857, -77.056267);
addNewLandmark("Massachusetts Institute of Technology", 42.360091, -71.09416);

// Step 2: Create index
db.landmarks.ensureIndex({
    loc : "2dsphere"
});

Truy vấn:Tìm các địa danh trong vòng 5 dặm.

var milesToRadian = function(miles){
    var earthRadiusInMiles = 3959;
    return miles / earthRadiusInMiles;
};
var landmark = db.landmarks.findOne({name: "Washington DC"});
var query = {
    "loc" : {
        $geoWithin : {
            $centerSphere : [landmark.loc.coordinates, milesToRadian(5) ]
        }
    }
};
// Step 3: Query points.
db.landmarks.find(query).pretty();

Đầu ra

{
        "_id" : ObjectId("540e70c96033ed0d2d9694fa"),
        "name" : "Washington DC",
        "loc" : {
                "type" : "Point",
                "coordinates" : [
                        38.8993487,
                        -77.0145665
                ]
        }
}
{
        "_id" : ObjectId("540e70c96033ed0d2d9694fc"),
        "name" : "Library of Congress",
        "loc" : {
                "type" : "Point",
                "coordinates" : [
                        38.888684,
                        -77.0047189
                ]
        }
}
{
        "_id" : ObjectId("540e70c96033ed0d2d9694fb"),
        "name" : "White House",
        "loc" : {
                "type" : "Point",
                "coordinates" : [
                        38.9024593,
                        -77.0388266
                ]
        }
}
{
        "_id" : ObjectId("540e70c96033ed0d2d9694fe"),
        "name" : "The Pentagon",
        "loc" : {
                "type" : "Point",
                "coordinates" : [
                        38.871857,
                        -77.056267
                ]
        }
}

Thông tin thêm:



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để kết nối từ xa với MongoDB trong máy chủ của tôi bằng java?

  2. Làm thế nào để đảo ngược một tập hợp thư giãn?

  3. MongoDB:kết quả truy vấn khớp với bất kỳ giá trị nào trong mảng

  4. CURSOR_NOT_FOUND - công việc cron của tôi bắt đầu chết dần giữa chừng

  5. Đang xóa dữ liệu chủ đề từ nhà sản xuất Java sang Mongodb