模式中的mongoose geojson,"无法提取地理密钥"错误

时间:2015-12-01 15:19:25

标签: node.js mongodb mongoose geojson

我有一个定义了架构的mongodb集合,我更新了这个架构以包含lat / lon坐标。

旧版本:

var schema = mongoose.Schema({
    id: String,
    name: String,
    address: String,
    city: String,
    zip: String,
    country: String,
    phoneNumber: String,
    mobile: String,
    website: String,
    email: String,
});

新版

var schema = mongoose.Schema({
    id: String,
    name: String,
    address: String,
    city: String,
    zip: String,
    country: String,
    phoneNumber: String,
    mobile: String,
    website: String,
    email: String,
    location: GeoJSON.Point
});

schema.index({ location: '2dsphere' });

GEOJSON.Point来自mongoose-geojson-schema,看起来像这样:

GeoJSON.Point = {
  'type'     : { type: String, default: "Point" },
  coordinates: [
    {type: "Number"}
  ]
}

在我添加location属性之前,该集合已包含数据。

显然现在发生的事情是,由于某种原因,mongodb使用{ coordinates: [], type: "Point" }作为现有文档的默认值,我得到如下错误:

 MongoError: Can't extract geo keys: { _id: ObjectId('5637ea3ca5b2613f37d826f6'), ...
 Point must only contain numeric elements 

我已经了解了如何在架构中指定默认值,但是如果是GeoJSON.Point数据类型,我认为无法将值设置为null

我也试过

db.collection.update({},{$set:{location:null},{multi:true})

但这似乎也无济于事。

是否因为location上的索引?

2 个答案:

答案 0 :(得分:0)

我认为您需要使用正确的架构将GeoJSON.Point升级为sub document

GeoJSON.Point = new mongoose.Schema({
  'type'     : { type: String, default: "Point" },
  coordinates: [ { type: "Number" } ]
});

结合默认情况下启用的minimize选项,这将使Mongoose仅保存location属性(如果实际设置)。

答案 1 :(得分:0)

我建议您不要将GeoJSON.Point用作架构类型。只需使用混合对象类型,一切都会正常工作。

location: Schema.Types.Mixed