工作中我用了Koa2做了後臺,選用了mongo數據庫。因爲要用到空間查詢顯示當前地圖視圖的空間查詢結果,經過一番搜索,總算解決了。
mongoose支持的空間查詢方式有near,box,circle以及geometry等等,基本滿足了業務需求。我只用到了box查詢,所以下面就分享一下我是如何使用的:
model設計
設計model時一定要設計好geom結構,不然提示報錯。最開始我把geom的類型設計成{type: String, coordinates: [Number]}
,結果運行時提示不允許在String上面執行$geoWithin語句。這裏的type與mongoose中設置類型的type有衝突,所以geom被誤認爲成了String.
const mongoose = require('../tool/db-util').mongoose
const Schema = mongoose.Schema
const projectSchema = new Schema({
... ...
build_reason: String,
build_type: String,
geom: {
type: {type: String},
coordinates: [Number]
}
})
// 創建空間索引
projectSchema.index({ 'geom': '2dsphere' })
// 開啓調試
mongoose.set('debug', true)
const ProjectModel = mongoose.model('project', projectSchema)
module.exports = {
ProjectModel
}
查詢方法
方法一和方法二執行效果相同,只是寫法不一樣
static async all (condition, extent, page, size) {
let extent = condition.extent.split(',')
let box = [[Number(extent[0]), Number(extent[1])], [Number(extent[2]), Number(extent[3])]
// 方法一
// let projects = await ProjectModel.find(condition).where('geom').within().box(box[0], box[1]).skip((page - 1) * size).limit(size)
// 方法二
let projects = await ProjectModel.find(condition).where('geom').within({box}).skip((page - 1) * size).limit(size)
let count = await ProjectModel.count(condition)
return {projects, page: {page, size, count}}
}
}
運行結果
正常