gpt4 book ai didi

mongodb - 在MongoDB中查询一个半​​径内的位置

转载 作者:IT老高 更新时间:2023-10-28 13:07:55 25 4
gpt4 key购买 nike

如果我有以下形式的文件:

{
pos: { lat: 0, lon: 30 }
}

集合中的用户(请假装这些是真正的纬度/经度:-))

获取某个半径范围内的所有值的正确方法是:50 英里?

最佳答案

这是一个 3 步过程。

  • 第 1 步)在文档中嵌入 GeoJSON 点。
  • 第 2 步)使用 2dsphere 为点的路径编制索引。
  • Step 3) 使用$geoWithin$centerSphere查询文档中的点。

要执行地理空间查询,您需要更改文档结构以匹配 GeoJSON 点。看起来像这样。

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

将您的收藏转换为 Point 格式的示例代码。

// 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();

之后,您可以在查询中使用 $geoWithin$near 运算符,如下例所示。

示例

设置

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"
});

查询:查找 5 英里内的地标。

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();

输出

{
"_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
]
}
}

更多信息:

关于mongodb - 在MongoDB中查询一个半​​径内的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25734092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com