Mongoose GeoJSON 在使用中间件时抛出“MongoError:无法提取地理键”

Posted

技术标签:

【中文标题】Mongoose GeoJSON 在使用中间件时抛出“MongoError:无法提取地理键”【英文标题】:Mongoose GeoJSON throws "MongoError: Can't extract geo keys" when using middleware 【发布时间】:2020-07-31 04:08:24 【问题描述】:

我在我的 NodeJS 项目中使用 Mongoose,并且我在子文档数组中有一个 GeoJSON 对象:

ParentSchema.js

import mongoose from 'mongoose';
import ChildeSchema from '[path]/ChildSchema.js';

const ParentSchema = mongoose.Schema(
  ...
  children: [ChildSchema],
  ...
);

ChildSchema.js

import mongoose from 'mongoose';
import geocoder from '[path]/geocoder.js'; // where I initialize the geocoder

const ChildSchema = mongoose.Schema(
  ...
  location:     
    // GeoJSON
    type: 
      type: String,
      enum: ['Point'],
      default: 'Point'
    ,
    // first enter longitude, then latitude
    coordinates: 
      type: [Number]
    //index: '2dsphere'  <-- committed out, also tried with the index
    
  ,
  ...
);

// middleware goes here

export default ChildSchema;

我在ChildSchema 中添加了一个中间件,它使用与mapquest 配合使用的geocoder 获取位置信息。

中间件(在 ChildSchema.js 中):

ChildScheme.pre('save', async function (next) 

  const geoDetails = await geocoder.geocode(this.fullAddress); // works fine, I'm getting the location

  // values are legal
  const latitude = geoDetails[0].latitude;
  const longitude = geoDetails[0].longitude;

  this.location = 
      type: 'Point',
      coordinates: [longitude, latitude] 
    ;

  next();

当我尝试创建一个新的父文档(使用带有 application/json Content-Type 的 POST)时,我收到以下错误:

MongoError: 无法提取地理键:the_parent_document 地理元素必须是数组或对象:类型:\"Point\"

我尝试应用在以下问题中找到的答案,但没有帮助:mongoose geojson in schema, “Can't extract geo keys” errorMongoError: Can't extract geo keysMongoose Schema for geoJson coordinatesHow does one represent MongoDB GeoJSON fields in a Mongoose Schema?@987654325 @

我错过了什么?提前感谢您的回答!

【问题讨论】:

【参考方案1】:

将密钥的名称更改为 location 以外的其他名称,并且有效...

【讨论】:

以上是关于Mongoose GeoJSON 在使用中间件时抛出“MongoError:无法提取地理键”的主要内容,如果未能解决你的问题,请参考以下文章

尝试将变量保存到 GeoJSON 点时出现 Mongoose CastError

Mongoose 在使用 .save() 方法更新文档时抛出 E11000 重复键错误

如何使用 GraphQl 查询 geojson 点?

如何在 MongoDB 中正确使用 $geoIntersects?

SetTimeout 在 Mongoose 模式后中间件中不起作用

跳过 Mongoose 中某些更新的时间戳中间件