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

news/2024/11/8 13:44:01/

前言:我们创建一个集合,添加测试数据,并执行 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.ppmy.cn/news/484348.html

相关文章

如何修改Linux的锁屏时间,调整Kali Linux的锁屏时间

调整Kali Linux的锁屏时间 锁屏是保护隐私的一种重要机制。当用户不操作电脑一段时间后,系统会进入锁屏状态。用户需要输入口令,才能重新进入系统。避免因为操作人员离开电脑后,被其他人员利用现有帐号权限对电脑进行操作。Kali Linux的锁屏是和黑屏功能是关联的。默认设置是…

js实现一个简单的锁屏功能

//********* 锁屏DIV *************************** function LockScreen(tag,title,width,height,url) { if (tag) //锁屏 { var lockdiv document.getElementById("lockscreen"); if (lockdiv!null) { lockdiv.style…

Android WallpaperManager 同时设置桌面壁纸与锁屏的问题

最近项目中,需要给手机设置桌面壁纸与锁屏。 大家都知道使用 WallpaperManager.setStream()方法就好 RequiresPermission(android.Manifest.permission.SET_WALLPAPER) public int setStream(InputStream bitmapData, Rect visibleCropHint,boolean allowBackup, …

使用CiLocks绕过Android的锁屏功能

关于CiLocks CiLocks是一款功能强大的Android渗透测试工具,在该工具的帮助下,研究人员可以轻松绕过Android设备的锁屏保护。 功能介绍 爆破四位PIN码; 爆破六位PIN码; 使用字典爆破锁屏密码; 绕过锁屏保护&#xff0…

Android:获取当前的锁屏壁纸或桌面壁纸

使用WallpaperManager类 FLAG_LOCK为锁屏壁纸 FLAG_SYSTEM为桌面壁纸 //使用WallpaperManager类TargetApi(Build.VERSION_CODES.N)private Bitmap getLockWallpaper(){WallpaperManager wallpaperManager WallpaperManager.getInstance(mContext);//获取WallpaperManager实例…

银河麒麟liunux下的屏幕保护与锁屏设置

windows中有屏幕保护程序,在人离开的一段时间后可以开启屏幕保护,而且还可以设置密码,非常有利于短时间离开电脑时的保护隐私。 在linux中其实也有类似的功能,只不过一开始以为要安装termsaver什么的,还要用xset命令等…

linux系统之屏保与锁屏命令

linux系统之屏保与锁屏命令。 一、屏保命令。 #显示屏保但不锁定,移动鼠标或敲击键盘后自动消失 gnome-screensaver-command -a#显示并锁定,移动鼠标或敲击键盘弹出密码框 gnome-screensaver-command -l二、锁屏命令。 #列出当前所有的会话。这是默认…

直接选择排序及其稳定性分析

直接选择排序 直接选择排序是一种很直观的排序方法。其操作是这样:先在未排序的序列中选择最小的元素(或最大的元素),把它与第一个元素交换,放在第一个位置,再在剩余未排序序列中选择第二小的,…