mongoose 空间查询

  工作中我用了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}}
    }
  }

运行结果

  正常


查询过程
前台展示

你可能感兴趣的:(mongoose 空间查询)