前言:我们创建一个集合,添加测试数据,并执行 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 鸣谢~