MongoDB 2.4允许使用我想使用的GeoJSON个对象和一些neat functions and indexes。
它希望GeoJSON对象以如下格式存储:
loc: {
type: 'Polygon',
coordinates: [[[-180.0, 10.0], [20.0, 90.0], [180.0, -5.0], [-30.0, -90.0]]]
}
所以在Mongoose中,人们会认为模式定义如下:
loc: { type: 'string', coordinates: [[['number']]] }
但目前存在两个问题:
有一个名为“type”的字段搞砸了Mongoose的架构解析 因为它允许在表单字段中定义字段:{type :, index:}等
Mongoose不喜欢嵌套数组。
克服这种情况的一种方法是简单地使用mongoose.Schema.Types.Mixed
,但我觉得必须有更好的方法!
答案 0 :(得分:46)
作为参考,Mongoose 3.6正式支持GeoJSON
示例(来自文档):
new Schema({ loc: { type: [Number], index: '2dsphere'}})
......然后......
var geojsonPoly = { type: 'Polygon', coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] }
Model.find({ loc: { $within: { $geometry: geojsonPoly }}})
// or
Model.where('loc').within.geometry(geojsonPoly)
答案 1 :(得分:15)
您必须使用Mixed来表示数组数组。将来有open ticket来支持这一点。
@nevi_me是正确的,您必须按照他的描述声明type
属性。
这是一个要点:https://gist.github.com/aheckmann/5241574
有关更多提示,请参阅此处的猫鼬测试:https://github.com/LearnBoost/mongoose/blob/master/test/model.querying.test.js#L1931
答案 2 :(得分:5)
创建了mongoose-geojson-schema包,以便在Mongoose Schema中轻松使用GeoJSON。
答案 3 :(得分:4)
我即将开始将我的MongoDB中的所有位置引用从'2d'
移动到GeoJSON,所以我会遇到同样的问题。
type
问题,您必须按照我下面的操作来实现它。 Mongoose正确地将其识别为字符串。mongoose.Schema.Types.Mixed
会起作用,但我认为你可以尝试下面我做的,让我知道它是否有效。我不在安装了mongo的PC附近试用架构。以下是我如何定义架构。嵌套数组可以调整工作,所以如果没有,请告诉我。
var LocationObject = new Schema ({
'type': {
type: String,
required: true,
enum: ['Point', 'LineString', 'Polygon'],
default: 'Point'
},
coordinates: [
[
{ type: [ Number ]
]
]
});
如果您在嵌套Array
时收到不良后果,请尝试相应。基本上更深的嵌套。
coordinates: [
{ type: [
{ type: [ Number ] }
] }
]
答案 4 :(得分:4)
Mongoose现在officially supports this。
简而言之,您所做的是,对于该架构,您使用typeKey
设置告诉mongoose使用不同的键来输入类型信息。这是一个例子:
var schema = new Schema({
// Mongoose interpets this as 'loc is an object with 2 keys, type and coordinates'
loc: { type: String, coordinates: [Number] },
// Mongoose interprets this as 'name is a String'
name: { $type: String }
}, { typeKey: '$type' }); // A '$type' key means this object is a type declaration
现在,您不是使用type
属性声明类型信息,而是使用$type
。这适用于模式级别,因此在需要它的模式中使用它。