我有一个定义了架构的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
上的索引?
答案 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