prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能

news2024/11/26 6:18:30

前言:我们创建一个集合,添加测试数据,并执行 mongodb 的地理空间查询,返回需要的数据。

1、通过schema.prisma, 创建 store 集合

在这里插入图片描述

2、通过 prisma/client ,插入 几条测试数据
  // 构造测试数据
  createList: async () => {
    await prisma.store.createMany({
      data: [
        { name: '三里屯MM1', location: { type: 'Point', coordinates: [116.458347, 39.940602] } },
        { name: '西直门GG1', location: { type: 'Point', coordinates: [116.361446, 39.946471] } },
        { name: '东直门MM2', location: { type: 'Point', coordinates: [116.440967, 39.945325] } },
        { name: '天安门MM3', location: { type: 'Point', coordinates: [116.403963, 39.915119] } },
        { name: '三里屯MM4', location: { type: 'Point', coordinates: [116.460054, 39.938063] } },
        { name: '三里屯MM5', location: { type: 'Point', coordinates: [116.461082, 39.944209] } },
        { name: '三里屯MM6', location: { type: 'Point', coordinates: [116.461065, 39.939399] } }

      ]
    })
  },

在这里插入图片描述
location 的数据格式为 GeoJSON,即地理位置信息的 JSON 表示法。 这里 type 指定类型为 点坐标coordinates:[] 存放经纬度数值 。 经度在前,纬度在后。

3、创建地理空间索引

在 prisma 中,使用 $runCommandRaw(),输入原生数据库命令创建索引:

    // 创建索引
   const createIndexResult = await prisma.$runCommandRaw({
     createIndexes: 'store', // 集合名称
     indexes: [{
       key: {
         "location": "2dsphere" // 索引字段和索引类型; 索引类型指定为  2dsphere
       },
       name: 'geoIndex' // 索引名称-自定义
     }]
   })

或者在 mongosh 中执行如下创建地理空间索引

db.store.createIndex( { location: "2dsphere" } ) // store 为我们创建的集合名称

4、运行地理空间查询命令
a、使用$near运算符查询,返回符合条件的数据。由近到远排序。

在这里插入图片描述

顺利查询出三里屯附近的 MM !
在这里插入图片描述

b、 使用 $genNear进行聚合查询。添加一些条件,并返回距离中心点的具体距离。

使用 prisma 提供的 aggregateRaw 方法,进行原生聚合查询
在这里插入图片描述

distance返回具体距离
在这里插入图片描述

总结:

1、MongoDB 中地理空间数据可存储为 GeoJSON 或者数组形式[]。如果是经纬度,则经度在前,纬度在后。
2、在执行地理空间查询前,需先创建索引,推荐索引类型为2dsphere
3、在 prisma 中如果使用的数据库是 mongodb, 在进行原生数据库查询时,可使用 prisma 提供的$runCommandRaw findRaw aggregateRaw 方法

mongoDB地理空间查询文档

文章参考自:https://juejin.cn/post/6981814561598865421 鸣谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMIP6数据处理方法与典型案例分析

气候变化关系到农业、生态系统、社会经济和人类生存与发展,是当今世界关注的重点问题之一。IPCC(Intergovernmental Panel on Climate Change)第6次评估报告指出,自 20 世纪 50 年代以来,从全球平均气温和海温升高、大…

Seata TCC 模式下解决幂等、悬挂、空回滚问题 | Spring Cloud56

一、前言 通过以下系列章节: docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

antd-vue - - - - - date-picker组件在非本地不好使?无法切换日期?

date-picker组件在非本地不好使?无法切换日期? 1.问题描述2.问题原因 & 解决办法 离离原上谱,真的是离了大谱 记录一个深深的踩坑记录!!! 选择日期,肯定要选择ui组件的date-picker&#xf…

tensorflow基础知识

计算图的理解 ref: https://zhuanlan.zhihu.com/p/344846077 计算图模型由节点(nodes)和线(edges)组成,节点表示操作符/算子Operator,线表示计算间的依赖。实线表示有数据传递的依赖,传递的数…

【LeetCode】HOT 100(17)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

three.js中通过gsap动画库实现物体的动画

一、什么是gsap GSAP(GreenSock Animation Platform)是一个JavaScript动画库,由GreenSock公司开发,用于在Web应用程序中创建高性能动画。 使用GSAP可以通过一些简单的动画操作来实现复杂的动画效果,例如TweenLite、T…

临期商品app小程序软件开发

临期商品APP小程序是一种专门销售或推广临近保质期商品的应用程序,以下是可能有助于临期商品APP小程序软件开发的功能: 商品展示:允许用户查看和浏览不同种类的临期商品,包括产品图片、描述、价格等信息。 用户登录和注册…

笔记:WebRTC 网络技术理论与实战(二)

WebRTC技术笔记 笔记:WebRTC 网络技术理论与实战(一) 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.n…

【Flutter——复选框实例代码超详细讲解!】

Flutter——复选框实例代码超详细讲解! 文章目录 Flutter——复选框实例代码超详细讲解!代码实现效果代码实例代码结构总结 代码实现效果 代码实例 import package:flutter/material.dart; // 导入 Flutter 的核心库void main() {runApp(const MyApp())…

linux-2.6.22.6内核poll总结

1.为什么需要poll,其原因是当进行某些操作时,该操作会一直消耗cpu,浪费资源,所以引入poll可以让该进程在指定时间内如果没有结果产生(可以是某个操作或者获取数据)则进行休眠,这样就会释放cpu。…

【MySQL】数据库基础 ②

✍LIKE 子句 说明: 使用 SELECT 来查询数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 WHERE 子句中可以使用等号 来设定获取数据的条件,如 "字段(text_title) 值()"。 但是有时候我们需要获取 text_…

Android 神奇的 SpannableStringBuilder

文章目录 前言一、SpannableStringBuilder 是什么?二、使用步骤1.示例代码2.参数对应start:样式生效的开始位置,包括该位置end: 样式结束的位置,不包括该位置flags:取值有如下四个Spannable.SPAN_EXCLUSIVE…

wandb快速上手、使用心得(超好用的Tensorboard高替品)

这里写目录标题 1 wandb介绍2 快速上手3 使用心得3.1 一张图展示两条线3.2 想要科学上网和wandb一起使用(离线使用)3.3 未完待续 1 wandb介绍 wandb地址:wandb Wandb(Weights & Biases)是一个用于机器学习实验跟踪…

智慧城市建设电气火灾智慧消防措施 安科瑞 许敏

1、引言 “经检测,发现管辖单位南通王子造纸企业二氧化氯装置发生二级警报,可能引发火灾,请立即出警。”日前,南通消防救援支队大数据平台DCS化工火源预警系统发出警报,大屏幕显示辖区企业南通王子造纸企业出现险情。D…

B站618“杀”疯了?UP主直播带货GMV连年破亿!

众多主流平台已经早早构建出较为完整的直播带货体系,而B站则是从去年双十一才宣布正式加入全平台直播带货,同时上线购物直播专区,到今年618年中购物大促,B站已经在大步向前摸索属于本平台的直播带货阵营。 一直以来B站带着二次元…

TC8:SOMEIPSRV_FORMAT_15-18

SOMEIPSRV_FORMAT_15: Instance ID field of the Type 1 Entry 目的 检查Type 1 Entry(Offer Service)的“Instance ID”字段 测试步骤 DUT CONFIGURE:启动具有下列信息的服务Service ID:SERVICE-ID-1Instance数量:1Tester:客户端-1发送SOME/IP Notification消息Entry T…

后端web开发之maven

这里写目录标题 介绍创建maven项目作用作用1作用2作用3 简介 依赖管理依赖配置依赖传递简介依赖传递的可视化快捷键 排除依赖依赖范围生命周期介绍执行流程 介绍 创建maven项目 注意 maven属于项目一级,所以在创建项目的时候 直接选择maven项目按照步骤创建即可&a…

Java Web基础面试题整理

1、什么是Servlet? 可以从两个方面去看Servlet: a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。 b、组件:服务器端用来处理客户端请求的组件,需要在we…

【2023,学点儿新Java-12】小结:阶段性复习 | Java学习书籍推荐(小白该读哪类Java书籍?有一定基础后,再去读哪类书籍?)

前情回顾: 【2023,学点儿新Java-11】基础案例练习:输出个人基础信息、输出心形 | Java中 制表符\t 和 换行符\n 的简单练习【2023,学点儿新Java-10】Java17 API文档简介&获取 |详解Java核心机制:JVM |详解Java内存…

【FPGA入门】第六篇、异步串口通信

目录 第一部分、相关知识 1、UART和RS232的区别 2、UART与USART的区别 3、全双工? 4、RS232通信协议 5、波特率 6、如何将外部异步信号变为内部同步信号? 7、什么时间点让FPGA去采集rx线上的数据? 第二部分、串口通信时序图 1、…