该 $nearSphere 运算符返回具有球体上指定点附近位置字段的文档,并使用球面几何图形计算距离。 运算符比基于地球的 $near计算更准确。
语法
{
<location field>: {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [<longitude>, <latitude>]
},
$maxDistance: <distance in meters>,
$minDistance: <distance in meters>
}
}
}
参数
| 参数 | DESCRIPTION |
|---|---|
location field |
包含 GeoJSON 点的字段 |
$geometry |
指定中心点的 GeoJSON Point 对象 |
$maxDistance |
可选。 球面上的最大距离(以米为单位) |
$minDistance |
可选。 球面上的最小距离(以米为单位) |
例子
让我们了解 stores 数据集中的示例 json 的用法。
{
"_id": "a715ab0f-4c6e-4e9d-a812-f2fab11ce0b6",
"name": "Lakeshore Retail | Holiday Supply Hub - Marvinfort",
"location": { "lat": -74.0427, "lon": 160.8154 },
"staff": { "employeeCount": { "fullTime": 9, "partTime": 18 } },
"sales": {
"salesByCategory": [ { "categoryName": "Stockings", "totalSales": 25731 } ],
"revenue": 25731
},
"promotionEvents": [
{
"eventName": "Mega Savings Extravaganza",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 6, "Day": 29 },
"endDate": { "Year": 2023, "Month": 7, "Day": 7 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 16 },
{ "categoryName": "Tree Ornaments", "discountPercentage": 8 }
]
},
{
"eventName": "Incredible Discount Days",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 9, "Day": 27 },
"endDate": { "Year": 2023, "Month": 10, "Day": 4 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 11 },
{ "categoryName": "Holiday Cards", "discountPercentage": 9 }
]
},
{
"eventName": "Massive Deal Mania",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 12, "Day": 26 },
"endDate": { "Year": 2024, "Month": 1, "Day": 2 }
},
"discounts": [
{ "categoryName": "Gift Bags", "discountPercentage": 21 },
{ "categoryName": "Bows", "discountPercentage": 19 }
]
},
{
"eventName": "Super Saver Soiree",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 3, "Day": 25 },
"endDate": { "Year": 2024, "Month": 4, "Day": 1 }
},
"discounts": [
{ "categoryName": "Tree Ornaments", "discountPercentage": 15 },
{ "categoryName": "Stockings", "discountPercentage": 14 }
]
},
{
"eventName": "Fantastic Savings Fiesta",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 6, "Day": 23 },
"endDate": { "Year": 2024, "Month": 6, "Day": 30 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 24 },
{ "categoryName": "Gift Wrap", "discountPercentage": 16 }
]
},
{
"eventName": "Price Plunge Party",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 9, "Day": 21 },
"endDate": { "Year": 2024, "Month": 9, "Day": 28 }
},
"discounts": [
{ "categoryName": "Holiday Tableware", "discountPercentage": 13 },
{ "categoryName": "Holiday Cards", "discountPercentage": 11 }
]
}
],
"company": "Lakeshore Retail",
"city": "Marvinfort",
"storeOpeningDate": { "$date": "2024-10-01T18:24:02.586Z" },
"lastUpdated": { "$timestamp": { "t": 1730485442, "i": 1 } },
"storeFeatures": 38
}
为了获得更好的性能,请先创建所需的 2dsphere 索引。
db.stores.createIndex({ "location": "2dsphere" })
示例 1:基本球面搜索
查询检索离球面(类似地球)表面的指定点(-141.9922、16.8331)最近的存储。
db.stores.find({
'location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [-141.9922, 16.8331]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
此查询返回的前两个结果为:
[
{
"_id": "643b2756-c22d-4063-9777-0945b9926346",
"name": "Contoso, Ltd. | Outdoor Furniture Corner - Pagacfort",
"location": {
"type": "Point",
"coordinates": [152.1353, -89.8688]
}
},
{
"_id": "daa71e60-75d4-4e03-8b45-9df59af0811f",
"name": "First Up Consultants | Handbag Corner - South Salvatore",
"location": {
"type": "Point",
"coordinates": [150.2305, -89.8431]
}
}
]
示例 2:复杂距离分析
此查询从 Point (65.3765, -44.8674) 检索 20 米到 200 米之间的存储。 查询在“圆环形”区域中搜索 - 查找距离至少 20 米但距离指定点不超过 200 米的存储。
db.stores.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [65.3765, -44.8674]
},
distanceField: "sphericalDistance",
minDistance: 20,
maxDistance: 200,
spherical: true
}
},
{
$project: {
name: 1,
location: 1,
distanceKm: { $divide: ["$sphericalDistance", 1000] },
_id: 0
}
},
{
$limit: 2
}
])
运算符 $nearSphere 和 $near. 之间的主要区别。
- 前者使用球面几何图形进行距离计算。
- 前者更准确地用于基于地球的距离计算。
- 前者更适合需要精确全局距离计算的应用程序
相关内容
- 查看有关 从 MongoDB 迁移到适用于 MongoDB 的 Azure Cosmos DB (vCore) 的选项。
- 详细了解 与 MongoDB 的功能兼容性。