当前位置: 首页 > news >正文

MongoDB聚合:$geoNear

$geoNear根据指定的点按照距离以由近到远的顺序输出文档。

从4.2版本开始,MongoDB移除了limitnum选项以及100个文档的限制,如果要限制结果文档的数量可以使用$limit阶段。

语法

{ $geoNear: { <geoNear options> } }

$geoNear操作接受一个包含了下面选项字段的文档。使用与已处理文档坐标系相同的单位指定所有距离:

|字段|类型|描述|
|-|-|
|distanceField|string|包含计算距离的输出字段,要指定内嵌文档字段可以使用点号.|
|distanceMultiplier|number|可选,查询返回的所有距离的乘数。例如,使用distanceMultiplier将球面查询返回的弧度乘以地球半径转换为公里|
|includeLocs|string|可选,指定识别位置的输出字段,用于计算距离。当位置字段包含多个位置时,该选项非常有用。要指定嵌入文档中的字段,可使用点符号.|
|key||可选,指定用于计算距离的地理空间索引字段。如果集合有多个2d或(且)2dsphere索引,就必须要使用key选项来指定要使用的索引字段路径。如果集合有超过一个的2d索引或2dsphere索引,而且没有指定一个给key,MongoDB将返回错误。如果没有指定key,而且集合只有一个2d索引或(且)2dsphere索引,MongoDB会找到第一个2d索引来使用,如果2d索引不存在,则会去找2dsphere索引来使用|
|maxDistance|number|可选,文档与中心点的最大距离。MongoDB 会将结果限制在与中心点的距离在指定范围内的文档。如果指定点是GeoJSON,则以米为单位指定距离;如果指定点是legacy坐标对,则以弧度为单位指定距离|
|near|GeoJSON点或legacy坐标对|查找最接近文件的点。如果使用2dsphere索引,可以使用GeoJSON点或legacy坐标对来指定点。如果使用2d索引,则要使用legacy坐标对来指定|
|query|document|可选,将结果限制为与查询匹配的文档。查询语法为常规MongoDB读操作查询语法。不能在$geoNear阶段的查询字段中指定$near谓词|
|spherical|boolean|可选,缺省为fasle,决定MongoDB如何计算两点间的距离。当为true是,MongoDB使用$nearSphere语义并且使用球形几何体计算距离。当为false时MongoDB 使用$near语义:球形几何用于2dsphere索引,平面几何用于2d索引|

使用

当使用$geoNear时需要考虑下面的情况:

  • $geoNear只能用于管道的第一个阶段。
  • 必须包含distanceField选项,distanceField选项指定了包含距离计算的字段。
  • $geoNear需要一个地理空间索引。如果集合上有多个地理空间索引,需要使用keys参数指定一下计算时要使用的索引,如果只有一个地理空间索引,可以不指定keys参数,$geoNear会隐式使用索引字段进行计算。
  • $geoNear阶段不可以在query字段中使用$near
  • 从版本4.2开始,$geoNear默认情况下不再限制100个文档。
  • 从版本4.1开始,near参数支持let选项和绑定let选项。
  • 从版本5.3开始,可以在时间序列集合的任何字段上使用$geoNear管道运算符。
  • 从版本6.0开始,可以在时间序列集合的任何字段上创建partial和2dsphere索引。

举例

places插入下面的数据:

db.places.insertMany( [{name: "Central Park",location: { type: "Point", coordinates: [ -73.97, 40.77 ] },category: "Parks"},{name: "Sara D. Roosevelt Park",location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },category: "Parks"},{name: "Polo Grounds",location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },category: "Stadiums"}
] )

下面的操作为location字段创建一个2dsphere索引:

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

最大距离

上面的places集合有一个2dsphere索引,下面的聚合使用$geoNear查找位置距离中心点[ -73.99279 , 40.719296 ]最多2米距离且category等于Parks的文档。

db.places.aggregate([{$geoNear: {near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },distanceField: "dist.calculated",maxDistance: 2,query: { category: "Parks" },includeLocs: "dist.location",spherical: true}}
])

聚合返回下面的结果:

{"_id" : 8,"name" : "Sara D. Roosevelt Park","category" : "Parks","location" : {"type" : "Point","coordinates" : [ -73.9928, 40.7193 ]},"dist" : {"calculated" : 0.9539931676365992,"location" : {"type" : "Point","coordinates" : [ -73.9928, 40.7193 ]}}
}

匹配的文档包含两个新字段:

  • dist.calculated字段,包含了计算后的距离
  • dist.location字段,包含了用于计算的位置

最小距离

下面的示例使用minDistance选项来指定文档与中心点的最小距离。下面的聚合查找所有位置距离中心点[ -73.99279 , 40.719296 ]至少2米距离且category等于Parks的文档。

db.places.aggregate([{$geoNear: {near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },distanceField: "dist.calculated",minDistance: 2,query: { category: "Parks" },includeLocs: "dist.location",spherical: true}}
])

使用let选项

在下面的例子中:

  • let选项用于将数组[-73.99279,40.719296]的值设置给变量$pt
  • pt被指定为near参数的let选项。
db.places.aggregate(
[{"$geoNear":{"near":"$$pt","distanceField":"distance","maxDistance":2,"query":{"category":"Parks"},"includeLocs":"dist.location","spherical":true}}
],
{"let":{ "pt": [ -73.99279, 40.719296 ] }
}
)

聚合返回符合下面条件的所有文档:

  • 距离let变量指定的点至少2米距离
  • category等于Parks
{_id: ObjectId("61715cf9b0c1d171bb498fd7"),name: 'Sara D. Roosevelt Park',location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },category: 'Parks',distance: 1.4957325341976439e-7,dist: { location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] } }
},
{_id: ObjectId("61715cf9b0c1d171bb498fd6"),name: 'Central Park',location: { type: 'Point', coordinates: [ -73.97, 40.77 ] },category: 'Parks',distance: 0.0009348548688841822,dist: { location: { type: 'Point', coordinates: [ -73.97, 40.77 ] } }
}

使用绑定let选项

let选项可以绑定一个变量用于$geoNear查询。

在下面的例子中,$lookup

  • 使用let定义$pt
  • pipeline使用$geoNear阶段。
  • $geoNear阶段用pt定义near
db.places.aggregate( [{$lookup: {from: "places",let: { pt: "$location" },pipeline: [{$geoNear: {near: "$$pt",distanceField: "distance"}}],as: "joinedField"}},{$match: { name: "Sara D. Roosevelt Park" }}
] );

聚合返回的结果中:

  • Sara D. Roosevelt Park文档作为主文档。
  • 将地点集合中的每个文档作为子文档,使用$pt变量计算距离。
{_id: ObjectId("61715cf9b0c1d171bb498fd7"),name: 'Sara D. Roosevelt Park',location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },category: 'Parks',joinedField: [{_id: ObjectId("61715cf9b0c1d171bb498fd7"),name: 'Sara D. Roosevelt Park',location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },category: 'Parks',distance: 0},{_id: ObjectId("61715cf9b0c1d171bb498fd6"),name: 'Central Park',location: { type: 'Point', coordinates: [ -73.97, 40.77 ] },category: 'Parks',distance: 5962.448255234964},{_id: ObjectId("61715cfab0c1d171bb498fd8"),name: 'Polo Grounds',location: { type: 'Point', coordinates: [ -73.9375, 40.8303 ] },category: 'Stadiums',distance: 13206.535424939102}]
}

指定地理空间索引

假定有一个places集合,该集合的location字段上有一个2dsphere索引,legacy字段上有一个2d索引。

places集合中的文档类似这个:

{"_id" : 3,"name" : "Polo Grounds","location": {"type" : "Point","coordinates" : [ -73.9375, 40.8303 ]},"legacy" : [ -73.9375, 40.8303 ],"category" : "Stadiums"
}

下面的例子使用key选项,为$geoNear聚合操作指定使用location字段的值而不是使用legacy字段的值。聚合管道同事使用$limit返回最多5个文档。

db.places.aggregate([{$geoNear: {near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] },key: "location",distanceField: "dist.calculated",query: { "category": "Parks" }}},{ $limit: 5 }
])

聚合返回下面的结果:

{"_id" : 8,"name" : "Sara D. Roosevelt Park","location" : {"type" : "Point","coordinates" : [-73.9928,40.7193]},"category" : "Parks","dist" : {"calculated" : 974.175764916902}
}
{"_id" : 1,"name" : "Central Park","location" : {"type" : "Point","coordinates" : [-73.97,40.77]},"legacy" : [-73.97,40.77],"category" : "Parks","dist" : {"calculated" : 5887.92792958097}
}

相关文章:

MongoDB聚合:$geoNear

$geoNear根据指定的点按照距离以由近到远的顺序输出文档。 从4.2版本开始&#xff0c;MongoDB移除了limit和num选项以及100个文档的限制&#xff0c;如果要限制结果文档的数量可以使用$limit阶段。 语法 { $geoNear: { <geoNear options> } }$geoNear操作接受一个包含…...

Docker-CE 国内源国内镜像

Docker-CE 就是 Docker Community Edition 的意思 docker-ce由docker官方维护 , docker.io由Debian维护 Docker官文 – Install Docker Engine on CentOS Docker官文 – Install Docker Engine on Fedora Docker官文 – Install Docker Engine on Debian Docker官文 – In…...

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】&#xff08;3&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows上搭建环境&#xff0c;安装node&#xff0c;rust环境&#xff0c;可以…...

C++ 堆排序

C 堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;其原理如下&#xff1a; 构建最大堆&#xff1a;将待排序的数组看作一个完全二叉树&#xff0c;并通过调整节点的位置构建一个最大堆。最大堆满足每个父节点的值都大于或等于其子节点的值。构建最大堆的过程可以…...

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…...

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…...

【数据分享】1929-2023年全球站点的逐年平均风速(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…...

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露&#xff1a; 像比如ContentProvider,BroadcastReceiver&#xff0c;Activity等组件有android:exported属性&#xff1b; 如果是私有组件 android:exported “false”&#xff1b; 如果是公有组件 android:exported “true” 且进行权限控制&…...

C#的Char 结构的像IsLetterOrDigit(Char)等常见的方法

目录 一、Char 结构的方法 二、Char.IsLetterOrDigit 方法 1.Char.IsLetterOrDigit(Char)用法 2.IsLetterOrDigit(String, Int32)方法 三、Char.IsLetter 方法 1.IsLetter(Char) 2.IsLetter(String, Int32) 四、Char.IsDigit 方法 1. IsDigit(String, Int32) 2.IsDig…...

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…...

1277. 统计全为 1 的正方形子矩阵

1277. 统计全为 1 的正方形子矩阵 题目链接&#xff1a;1277. 统计全为 1 的正方形子矩阵 代码如下&#xff1a; class Solution { public:int countSquares(vector<vector<int>>& matrix) {if(matrix.size()0||matrix[0].size()0) return 0;//dp[i][j]代表…...

Python 3 时间序列可视化指南

简介 时间序列分析属于统计学的一个分支&#xff0c;涉及对有序的、通常是时间性的数据进行研究。当适当应用时&#xff0c;时间序列分析可以揭示意想不到的趋势&#xff0c;提取有用的统计数据&#xff0c;甚至预测未来的趋势。因此&#xff0c;它被应用于许多领域&#xff0…...

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…...

【Docker】01 Docker安装与配置

文章目录 一、Docker二、离线安装Docker三、联网安装Docker3.1 下载YUM软件库文件3.2 安装epel-release3.3 安装yum-utils3.4 设置镜像仓库3.5 查看docker-ce所有版本3.6 安装Docker3.7 启动Docker3.8 查看Docker信息3.9 启动第一个容器 四、一些配置4.1 登录DockerHub4.2 镜像…...

Unity3d Shader篇(六)— BlinnPhong高光反射着色器

文章目录 前言一、BlinnPhong高光反射着色器是什么&#xff1f;1. BlinnPhong高光反射着色器的工作原理2. BlinnPhong高光反射着色器的优缺点优点缺点 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三…...

Go-zero微服务个人探究之路(十二)定时任务的选择调研

前言 很多时候后台需要做定时任务的需求&#xff0c;笔者的项目采用go-zero框架微服务框架&#xff0c;需要做定时任务&#xff0c;于是做了如下方法调研&#xff0c;共有大概三种主要选择 方案 难度总体由容易到复杂 go的timer库 通过Go的标准库time中的Ticker和Tick功能…...

Java中,List、Map和Set的区别是什么?

在Java中&#xff0c;List、Map和Set是三种常用的集合类型&#xff0c;它们之间的主要区别如下&#xff1a; 1、List List是有序集合&#xff0c;它可以包含重复元素。 List中的元素是按照插入顺序排列的&#xff0c;可以通过索引访问每个元素。 Java中常见的List实现类有A…...

Google刚刚推出了图神经网络Tensorflow-GNN

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

链表基础知识汇总

链表 链表是一种基本的数据结构&#xff0c;是由一系列节点组成的集合。每个节点包含两个部分&#xff1a;值和指向下一个节点的指针。链表中的节点可以动态地添加、删除&#xff0c;其大小可以根据需要进行扩展或缩小。 链表通常用于处理不固定长度的数据结构&#xff0c;具有…...

Educational Codeforces Round 2(远古edu计划)

A. 恶心模拟。。 模拟一下分类即可 数字类&#xff0c;数字0&#xff0c;或者都是数字 字母类&#xff0c;字母空的也是字母&#xff0c;有字母就是字母 #include<bits/stdc.h> #define INF 1e9 using namespace std; typedef long long ll; const int N2e59; strin…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...