工作中我用了Koa2做了后台,选用了mongo数据库。因为要用到空间查询显示当前地图视图的空间查询结果,经过一番搜索,总算解决了。
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}}
}
}
运行结果
正常
查询过程 前台展示