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

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

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

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第1张图片

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] } }

      ]
    })
  },

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第2张图片
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运算符查询,返回符合条件的数据。由近到远排序。

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第3张图片

顺利查询出三里屯附近的 MM !
prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第4张图片

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

使用 prisma 提供的 aggregateRaw 方法,进行原生聚合查询
prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第5张图片

distance返回具体距离
prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能_第6张图片

总结:

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

mongoDB地理空间查询文档

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

你可能感兴趣的:(prisma,node,mongodb,mongodb,prisma,实现附近的人)