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

運行結果

  正常
  這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章